【数据结构】-- 排序算法习题总结

      排序              时间复杂度         空间复杂度               稳定性
  冒泡排序      O(n^2)  优化后O(n)               O(1)                 稳定
  快速排序

        最好O(n*logn)     

        最坏O(n^2)

     最好O(logn)

     最坏O(n)

              不稳定
直接插入排序      最好O(n)   最坏O(n^2)              O(1)                 稳定
   希尔排序     说不准 O(n^1.3~n^1.5)              O(1)               不稳定
   选择排序                O(n^2)              O(1)               不稳定
   归并排序
      O(nlogn)
           O(logn)                 稳定
    堆排序  创建根堆向下调整法时间复杂度是O(n)                          稳定

11.下列排序方法中,哪一种是不稳定的( )

A.直接插入排序

B.归并排序

C.选择排序

D.冒泡排序

直接插入一般可以从前向后进行元素的插入,相同元素的相对位置可以不发生变化。

归并也可以保证相对位置不变。

冒泡排序在元素相同的情况下也可以不进行交互,也可以保证稳定。

选择排序的思想是每次选出最值,放在已排序序列的末尾,如果最值有多个,而选出的为最后一个最值,会导致相对位置发生变化。当然选择排序也可以变成稳定的,只要保证相同的值选择第一个就可以。

答案:C

14.下列排序算法中,占用辅助空间最多的是( )

A.归并排序

B.快速排序

C.希尔排序

D.堆排序

归并排序空间复杂度:n

快排: logn

希尔,堆排: 1

答案:A

15.下列排序算法中,最坏时间复杂度不为O(n^2)的是( )

A.堆排序

B.快速排序

C.选择排序

D.插入排序

堆排: 堆为完全二叉树,每次调整的时间最坏为logn,所以其时间复杂度最坏为nlogn

快排: 如果每次划分只有一半区间,则时间复杂度为n^2

选择排序:时间复杂度始终为n^2

插入排序:如果序列逆序,每次都需要移动元素,时间复杂度n^2

答案:A

17.以下哪种排序算法对[1, 3, 2, 4, 5, 6, 7, 8, 9]进行排序最快( )

A.直接插入排序

B.快速排序

C.归并排序

D.堆排序

次序列接近有序,所以如果是插入排序,时间复杂度逼近O(n)

快排: 逼近O(n^2)

归并和堆排仍然是nlogn

答案:A

18.下列排序算法中,在待排序数据已有序时,花费时间反而最多的是(D )排序。

A.堆排序

B.归并排序

C.希尔排序

D.快速排序

20.用某种排序方法对关键字序列 25 84 21 47 15 27 68 35 20 进行排序,序列的变化情况采样如下:

20 15 21 25 47 27 68 35 84

15 20 21 25 35 27 47 68 84

15 20 21 25 27 35 47 68 84

请问采用的是以下哪种排序算法( )

A.选择排序

B.希尔排序

C.归并排序

D.快速排序

此题中的排序是快排二分排序的思想,第一趟的基准值是25,第二趟的基准值分别是20,47,第三趟的基准值分别是15,21,35,68

答案:D

1.对关键字{10,20,8,25,35,6,18,30,5,15,28}序列进行希尔排序,取增量d =5时,排序结果为()

A.{6,18,8,5,15,10,20,30,25,35,28}

B.{10,18,8,5,15,6,20,30,25,35,28}

C.{10,20,8,5,15,6,18,30,25,35,28}

D.{10,20,30,5,8,6,15,18,25,28,35}

 答案:A

2.以下排序方式中占用O(n)辅助存储空间的是()

A.简单排序

B.快速排序

C.堆排序

D.归并排序

答案:D

3.若需在O(nlog2n)的时间内完成对数组的排序,且要求排序是稳定的,则可选择的排序方法是()

A.快速排序

B.堆排序

C.归并排序

D.直接插入排序

答案:C

4.关于排序,下面说法不正确的是 ()

A.快排时间复杂度为O(N*logN),空间复杂度为O(logN)

B.归并排序是一种稳定的排序,堆排序和快排均不稳定

C.序列基本有序时,快排退化成冒泡排序,直接插入排序最快

D.归并排序空间复杂度为O(N), 堆排序空间复杂度的为O(logN)

答案:D

5.下列各排序法中,最坏情况下的时间复杂度最低的是()

作业内容

A.希尔排序

B.快速排序

C.堆排序

D.冒泡排序

答案:C

19.下面的排序算法中,初始数据集的排列顺序对算法的性能无影响的有( )

① 快速排序

② 希尔排序

③ 插入排序

④ 堆排序

⑤ 归并排序

⑥ 选择排序

A.①④⑤

B.④⑤⑥

C.②③⑥

D.②③⑤⑥

快排: 初始顺序影响较大,有序是,性能最差

插入: 接近有序,性能最好

希尔:希尔是对插入排序的优化,这种优化是在无序的序列中才有明显的效果,如果序列接近有序,反而是插入最优。

堆排,归并,选择对初始顺序不敏感

答案:B

2.使用选择排序对长度为100的数组进行排序,则比较的次数为( )

A.5050

B.4950

C.4851

D.2475

选择排序,每次都要在未排序的所有元素中找到最值,

如果有n个元素,则

第一次比较次数: n - 1

第二次比较次数: n - 2

....

第n - 1次比较次数: 1

所有如果n = 100

则比较次数的总和:99 + 98 + ...... + 1

共4950次。

答案:B

4.现有数字序列 5 11 7 2 3 17,目前要通过堆排序进行降序排序,那么由该序列建立的初始堆应为( )

A.2 3 7 11 5 17

B.17 11 7 2 3 5

C.17 11 7 5 3 2

D.2 3 5 7 11 17

要降序排列,所以要建小堆,每次把堆顶元素放在当前堆的最后一个位置

建堆要进行向下调整算法(从最后一个非叶子节点开始进行向下调整算法,直到根元素)

5

11 7

2 3 17

5

2 7

11 3 17

2

3 7

11 5 17

所以初始堆序列为: 2 3 7 11 5 17

答案:A

5.下列关于归并排序的说法中正确的是( )

A.归并排序不需要辅助空间

B.归并排序的时间复杂度是O(logn)

C.归并排序是稳定排序

D.归并排序的操作方式类似二叉树的前序遍历

归并排序需要一个辅助空间暂时保存部分区间的排序元素

归并排序是一种二分排序算法,每次都需要给n个元素排序,排序的过程需要logn,即树的高度,所以时间复杂度为nlogn

归并排序中,相同元素的相对位置不会发生变化,所以是稳定排序

答案:C

7.下列选项中,不可能是快速排序第2趟排序后的结果的是( )

A.2 3 5 4 6 7 9

B.2 7 5 6 4 3 9

C.3 2 5 4 7 6 9

D.4 2 3 5 7 6 9

这里说的是快排的第二趟,即在第一趟快排的结果的基础上进行的,如果已经经过了一趟排序,则会通过第一趟选择的基准值划分两个子区间,每个子区间也会以区间内选择的基准值划分成两部分。

A: 第一趟的基准值可以为2, 第二趟的基准值可以为3

B: 第一趟的基准值可以为2, 第二趟的基准值可以为9

C: 第一趟的基准值只能是9,但是第二趟的基准值就找不出来,没有符合要求的值作为基准值,所以不可能是一个中间结果。

D: 第一趟的基准值可以为9, 第二趟的基准值可以为5

答案:C

8.对n个元素执行快速排序,需要的额外空间的大小为(   )

A.O(1)

B.O(n)

C.O(logn)

D.O(nlogn)

如果是递归算法,所递归的深度大概为二叉树的深度,即logn

如果是非递归算法,需要模拟递归的过程,即需要保存子区间的索引,每次都会成对的保存,最多保存的索引也和二叉树的高度有关:2 * logn

所以空间复杂度为logn

 答案:C

9.下列关于三数取中法快速排序的描述错误的是( )

A.三数取中法可以有效避免快排单链的情况,尤其对已经有序的序列的速度改善尤为明显

B.三数取中法依然无法完全解决针对某种特殊序列复杂度变为O(n)的情况

C.三数取中法一般选取首、尾和正中三个数进行取中

D.三数取中法的快速排序在任何情况下都是速度最快的排序方式

B选项所说的特殊序列比如元素全部相同,此时也无法改善性能。

D选项,三数取中法能过保证快排的平均时间复杂度为nlogn,并不是在所有情况下都是最快的,比如完全有序的序列,冒泡排序可以做到O(n)

 答案:D

10.下列关于快速排序的非递归算法的说法中错误的是( )

A.快速排序的非递归遍历可以使用栈模拟二叉树的前序遍历的方式实现

B.快速排序的非递归遍历可以使用队列模拟二叉树的层序遍历的方式实现

C.快速排序的非递归遍历可以明显的提升排序的速度

D.快速排序的非递归遍历大大降低了栈空间的开销

快排的非递归是在模拟递归的过程,所以时间复杂度并没有本质的变化,但是没有递归,可以减少栈空间的开销。栈和队列都可以实现。

 答案:C

13.下列关于排序方法和其平均时间复杂度,配对错误的是(   )

A.堆排序——O(nlog2 n)

B.直接插入排序——O(n^2)

C.选择排序——O(n^2)

D.归并排序——O(n^2)

归并排序是二分排序,其实际复杂度为nlogn

 答案:D

12.下列排序方法中,每一趟排序结束时都至少能够确定一个元素最终位置的方法是( )

① 选择排序

② 归并排序

③ 快速排序

④ 堆排序

A.①④

B.①②④

C.①③④

D.①②③④

选择排序每次选一个最值,放在最终的位置

快速排序每次基准值的位置也可以确定

堆排序每次堆顶元素的位置也可以确定

所以这三种方法都可以每次至少确定一个元素的位置

而归并排序每次都需要对n个元素重新确定位置,所以不能保证每次都能确定一个元素位置,有可能每次排序所有元素的位置都为发生变化。

 答案:C

16.下列排序算法中,最好时间复杂度和最坏时间复杂度不相同的是( )

A.快速排序

B.归并排序

C.选择排序

D.堆排序

快排: n^2 ~ nlogn

归并: nlogn

选择: n^2

堆排: nlogn

 答案:A

4.在一颗度为3的树中,度为3的结点有2个,度为2的结点有1个,度为1的结点有2个,则叶子结点有( )个

A.4

B.5

C.6

D.7

设度为i的节点个数为ni, 该树总共有n个节点,则n=n0+n1+n2+n3. 

有n个节点的树的总边数为n-1条.

根据度的定义,总边数与度之间的关系为:n-1=0*n0+1*n1+2*n2+3*n3.

联立两个方程求解,可以得到n0 = n2 + 2n3 + 1,  n0=6

 答案:C

5.一颗拥有1000个结点的树度为4,则它的最小深度

A.5

B.6

C.7

D.8

如果这棵树每一层都是满的,则它的深度最小,假设它为一个四叉树,高度为h,则这个数的节点个数为(4^h - 1) / 3,当h = 5, 最大节点数为341, 当h = 6, 最大节点数为1365,所以最小深度应该为6。

答案:B

17.对任意一颗二叉树,设N0、N1、N2分别是度为0、1、2的结点数,则下列式子中一定正确的是( )

A.N0 = N2 + 1

B.N1 = N0 + 1

C.N2 = N0 + 1

D.N2 = N1 + 1

节点总数N: N = N0 + N1 + N2

度和边的关系: N - 1 = 0 * N0 + 1 * N1 + 2 * N2

上面两个式子可以推出: N0 + N1 + N2 - 1 = N1 + 2 * N2

可得: N0 = N2 + 1

 答案:A

16.设根结点的深度为1,则一个拥有n个结点的二叉树的深度一定在(   )区间内

A.[log(n + 1),n]

B.[logn,n]

C.[log(n + 1),n - 1]

D.[log(n + 1),n + 1]

最大深度: 即每次只有一个节点,次数二叉树的高度为n,为最高的高度

最小深度: 此树为完全二叉树, 如果是完全二叉树

根据二叉树性质,完全二叉树的高低为 h = log(n+1)向上取整

故选择A

 答案:A

6.给定一个整数sum,从有N个有序元素的数组中寻找元素a,b,使得a+b的结果最接近sum,最快的平均时间复杂度是(   )

A.O(n)

B.O(n^2)

C.O(nlogn)

D.O(logn)

  此题目中,数组元素有序,所以a,b两个数可以分别从开始和结尾处开始搜,根据首尾元素的和是否大于sum,决定搜索的移动,整个数组被搜索一遍,就可以得到结果,所以最好时间复杂度为n

 答案:A

1.如果一个函数的内部中只定义了一个二维数组a[3][6],请问这个函数的空间复杂度为(   )

A.O(n)

B.O(n^2)

C.O( 1 )

D.O(m*n)

  解析:函数内部数组的大小是固定的,不论函数运行多少次,所需空间都是固定大小的,因此空间复杂度为O(1)

 答案:C

下面关于哈希说法正确的是()

A.哈希是一种查找的方法,不是数据结构

B.采用哈希方式解决问题时,可以不用哈希函数

C.哈希查找的时间复杂度一定是O(1)

D.哈希是以牺牲空间为代价,提高查询的效率

  A:错误,哈希是一种用来进行高效查找的数据结构,查找的时间复杂度平均为O(1)

  B:错误,哈希之所以高效,是引用使用了哈希函数将元素与其存储位置之间建立了一一对应的关 系,因此必须使用    哈希函数

  C:错误,不一定,因为存在哈希冲突,一般基本都是O(1)

  D:正确,采用哈希处理时,一般所需空间都会比元素个数多,否则产生冲突的概率就比较大,影 响哈希的性能

选择D

散列文件使用散列函数将记录的关键字值计算转化为记录的存放地址。由于散列函数不是一对一的关系,所以选择好的()方法是散列文件的关键。 

A.散列函数

B.除余法中的质数

C.冲突处理

D.散列函数和冲突处理

   要使哈希高效:选择好的哈希函数非常关键

   好的哈希函数可以减少发生冲突的概率

   万一发生冲突,好的处理好戏冲突的方法也比较关键,否则冲突处理不当,也会增加后序元素冲 突的概率

选择D

  

散列函数有一个共同性质,即函数值应按()取其值域的每一个值。 

A.最大概率

B.最小概率

C.同等概率

D.平均概率

  哈希函数设计原则:

  1. 哈希函数应该尽可能简单

  2. 哈希函数的值域必须在哈希表格的范围之内

  3. 哈希函数的值域应该尽可能均匀分布,即取每个位置应该是等概率的

选择C

解决散列法中出现冲突问题常采用的方法是()

A.数字分析法、除余法、平方取中法

B.数字分析法、除余法、线性探测法

C.数字分析法、线性探测法、多重散列法

D.线性探测法、多重散列法、链地址法

  注意要区分清楚:哈希冲突的处理方法和哈希函数

  哈希函数作用是:建立元素与其存储位置之前的对应关系的,在存储元素时,先通过哈希函数计算 元素在哈希表格中的存储位置,然后存储元素。好的哈希函数可以减少冲突的概 率,但是不能够绝对避免,万一发生哈希冲突,得需要借助哈希冲突处理方法来 解决。

   常见的哈希函数有:直接定址法、除留余数法、平方取中法、随机数法、数字分析法、叠加法等

   常见哈希冲突处理:闭散列(线性探测、二次探测)、开散列(链地址法)、多次散列

选择D

2.下面的哪个序列可能是二叉搜索树中序遍历的结果?

A.7 3 8 2 9 4 11

B.2 3 4 7 8 9 11

C.11 2 9 3 8 4 7

D.以上均可

二叉搜索树有个非常重要的特性:中序遍历的结果是有序的

选择B

 

4.若负载因子a为1,则向哈希表中散列元素时一定会产生冲突()

A.对

B.错

哈希冲突不是一定会产生,只有待插入元素通过哈希函数计算出要插入的位置,该位置上有数据时才会发生哈希冲突

选择B 

 

3.采用哈希表组织100万条记录,以支持字段A快速查找,则下列说法错误的是( )

A.理论上可以在常数时间内找到特定记录

B.所有记录必须存在内存中

C.拉链式哈希法最坏查找时间复杂度是O(n)

D.哈希函数的选择跟A无关

 

A正确:哈希表就是用来查找的数据结构,用空间换取的时间,因此哈希表查找的时间复杂度平均为O(1),也就是常数范围内就可以找到

B正确:哈希属于内存数据库,即集合中的数据必须在内容中通过哈希的方式组织,才能准确的查找

C错误:哈希表实现时,会通过一些机制限制链表过长的情况,比如:扩容,使用红黑树替换链表,因此肯定不会让所有元素挂到一个链表下的情况发生,因此不会出现O(n)的

场景

D正确:哈希函数的选择和数据整体情况有关,与单个元素没有直接关联

答案C

下面关于二叉搜索树正确的说法是( )

A.待删除节点有左子树和右子树时,只能使用左子树的最大值节点替换待删除节点

B.给定一棵二叉搜索树的前序和中序遍率历结果,无法确定这棵二叉搜索树

C.给定一棵二叉搜索树,根据节点值大小排序所需时间复杂度是线性的

D.给定一棵二叉搜索树,可以在线性时间复杂度内转化为平衡二叉搜索树

  A:错误,当待删除节点的左右子树均存在时,既可以在左子树中找一个最大的节点作为替代节 点,也可以在右子树中找一个最小的节点作为替代节点,左右子树中都可以找替代节点

  B:错误,根据前序遍历和中序遍历,是可以确定一棵树的结构,使用两个遍历结果确定树的结构, 其中有一个遍历结果必须要是中序遍历结果。

  C:正确,二叉搜索树遍历一遍,就可以得到一个有序序列,因此,时间复杂度为O(N)

  D:错误,这里面还需要牵扯到旋转等其他操作,时间复杂度不是线性的

选择C

1.设哈希表长度为11,哈希函数H(K)=(K的第一个字母在字母表中的序号)MOD11,若输入顺序为(D,BA,TN,M,CI,I,K,X,TA),采用内散列表,处理冲突方法为线性探测法,要求构造哈希表,在等概率情况下查找成功平均查找长度为()

A. 4

B. 3

C. 20/9

D. 23/9

根据需要存放到哈希表的数据使用线性探测法进行存放。得出如下表结构:

【数据结构】-- 排序算法习题总结_第1张图片

表格下方的数字,就是查找成功的次数。得出答案选择C。

 

 

你可能感兴趣的:(数据结构篇,排序算法,数据结构,算法,java)