算法与数据结构复习 第七章 排序(详解)

第七章 排序

书面作业

一、判断题

1、仅基于比较的算法能得到的最好的“最坏时间复杂度”是 O(NlogN)。 (T)

解析:

  • 下界
    所谓“下界”, 顾名思义就是对于一个长度为n的序列所需要的最少比较次数。

  • 最优下界

    什么时候最优?决策树从根节点到叶节点的最短长度为n-1,既长度为n的序列本身就是有序(序列从左到右,以升序表示为有序)时就是最优情况,冒泡排序和直接插入法在最优情况下时间复杂度就是o(n)。

  • 最坏下界

    什么时候最坏?决策树从根节点到叶节点的长度为log(n!),既从根节点至少需要log(n!)次比较才能到叶节点。当n很大时根据斯特林公式log(n!)=nlogn,既最坏情况下时间复杂度下界为O(nlogn)。

2、对 N 个记录进行简单选择排序,比较次数和移动次数分别为 O( N 2 N^2 N2)和 O(N)。(T)

解析:
比较次数= n − 1 + n − 2 + n − 3 + ⋯ + 1 = ( n − 1 + 1 ) ( n − 1 ) / 2 = n ( n − 1 ) / 2 n-1+n-2+n-3+\dots+1=(n-1+1)(n-1)/2=n(n-1)/2 n1+n2+n3++1=(n1+1)(n1)/2=n(n1)/2

移动次数=n;

3、对 N 个不同的数据采用冒泡排序进行从大到小的排序,当元素基本有序时交换元素次数肯定最多。 (F)

解析:
元素基本有序时不交换;

冒泡排序:

  • 原理:比较两个相邻的元素,将值大的元素交换到左边

  • 思路:

    • 依次比较相邻的两个数,将比较大的数放在前面,比较小的数放在后面。
    • 第一次比较:首先比较第一和第二个数,将大数放在前面,将小数放在后面。
    • 比较第2和第3个数,将大数放在前面,小数放在后面。
    • 如此继续,知道比较到最后的两个数,将大数放在前面,小数放在后面,重复步骤,直至全部排序完成
    • 在上面一趟比较完成后,最后一个数一定是数组中最小的一个数,所以在比较第二趟的时候,最后一个数是不参加比较的。
    • 在第二趟比较完成后,倒数第二个数也一定是数组中倒数第二小数,所以在第三趟的比较中,最后两个数是不参与比较的。
    • 依次类推,每一趟比较次数减少依次

冒泡排序

4、对 N 个记录进行堆排序,需要的额外空间为 O(N)。(F)

解析:

堆排序不需要额外空间,只通过位置交换进行排序,额外空间为 O(1);

5、希尔排序是稳定的算法。(F)

解析:

希尔排序是不稳定的算法;

6、要从 50 个键值中找出最大的 3 个值,选择排序比堆排序快。 (T)

解析:

规模较小直接选择排序快;

7、对 N 个记录进行快速排序,在最坏的情况下,其时间复杂度是 O(NlogN)。(F)

解析:

img

8、直接插入排序算法在最好情况下的时间复杂度为 O(n)。 (T)

二、选择题

1、若数据元素序列{ 12, 13, 8, 11, 5, 16, 2, 9 }是采用下列排序方法之一得到的第一趟排序后的结果,则该排序算法只能是: (D)
A. 快速排序
B. 选择排序
C. 堆排序
D. 归并排序

解析:

  • 排除选择排序,因为选择排序后,最前面一定是最小的或最大的;

  • 排除快速排序,因为快速排序一次后,有两个值相同,有一个数存放在临时变量;

  • *排除堆*排序

    • 一次排序后建堆

      2
      5
      8
      9
      11
      12
      13
      16

      由图可看出不符合堆;

  • 归并排序 12 13 | 8 11 | 5 16 | 2 9 符合;

2、在内部排序时,若选择了归并排序而没有选择插入排序,则可能的理由是:(B)

  1. 归并排序的程序代码更短
  2. 归并排序占用的空间更少
  3. 归并排序的运行效率更高
    A. 仅 2
    B. 仅 3
    C. 仅 1、2
    D. 仅 1、3 2-9

解析:

  • 选择排序的时间复杂度最优最坏和平均都为O(n2) ,而归并的时间复杂度则都为O(nlog2n), 可见归并的效率高;
  • 越优的算法的步骤就一般会越复杂, 例如冒泡和选择代码都很简单, 所以归并比选择代码复杂;
  • 归并是属于用空间换时间的算法,在堆区new出了空间,而选择排序不需要创建空间,空间复杂度为O(1);

3、对初始状态为递增序列的表按递增顺序排序,最费时间的是()算法。 (A)
A. 快速排序
B. 归并排序
C. 插入排序
D. 堆排序

解析:

  • 堆排序:最好最坏都是nlogn;

  • 快排:最好情况一趟比较可以划分两等份nlogn 最坏相对有序n*n;

  • 插入:最好相对有序n;

  • 归并:最好最坏都是nlogn;

4、就平均性能而言,目前最好的内排序方法是(C)排序法。 (3 分)
A. 希尔
B. 冒泡
C. 快速
D. 交换

解析:
经过实验,会发现相同的数据规模,快速排序比堆排序的效率高很多,并且随着数据规模的扩大,二者的差距不断扩大,快速排序的优势越来越明显。快速排序的时间复杂度近似线性增长,堆排序则要大很多。究其原因,应该有以下几个方面:

  • 在堆排序(小根堆)的时候,每次总是将最小的元素移除,然后将最后的元素放到堆顶,再让其自我调整。这样一来,有很多比较将是被浪费的,因为被拿到堆顶的那个元素几乎肯定是很大的,而靠近堆顶的元素又几乎肯定是很小的,最后一个元素能留在堆顶的可能性微乎其微,最后一个元素很有可能最终再被移动到底部。在堆排序里面有大量这种近乎无效的比较。随着数据规模的增长,比较的开销最差情况应该在(线性*对数)级别,如果数据量是原来的10倍,那么用于比较的时间开销可能是原来的 10 l o g 2 10 10log_210 10log210倍。
  • 堆排序的过程中,需要有效的随机存取。比较父节点和字节点的值大小的时候,虽然计算下标会很快完成,但是在大规模的数据中对数组指针寻址也需要一定的时间。而快速排序只需要将数组指针移动到相邻的区域即可。在堆排序中,会大量的随机存取数据;而在快速排序中,只会大量的顺序存取数据。随着数据规模的扩大,这方面的差距会明显增大。在这方面的时间开销来说,快速排序只会线性增长,而堆排序增加幅度很大,会远远大于线性。
  • 在快速排序中,每次数据移动都意味着该数据距离它正确的位置越来越近,而在堆排序中,类似将堆尾部的数据移到堆顶这样的操作只会使相应的数据远离它正确的位置,后续必然有一些操作再将其移动,即“做了好多无用功”。

为什么说快速排序是性能最好的排序算法

5、对序列{15,9,7,8,20,-1,4,} 用希尔排序方法排序,经一趟后序列变为{15,-l,4, 8,20,9,7}则该次采用的增量是(C)。
A. 2
B. 1
C. 4
D. 3

解析:
9和-1替换,7和4替换,增量为4;

6、下列排序算法中,哪种算法可能出现:在最后一趟开始之前,所有的元素都不在其最终的位置上?(设待排元素个数 N>2) (B)
A. 冒泡排序
B. 插入排序
C. 堆排序
D. 快速排序

解析:

插入排序中, 如果最后一个数最小, 前面所有的数字都要移动位置;

7、对于 7 个数进行冒泡排序,需要进行的比较次数为: (C )
A. 7
B. 14
C. 21
D. 49
解析:

6+5+4+3+2+1=21;

8、排序方法中,从未排序序列中依次取出元素与已排序序列中的元素进行比较,将其放入已排序序列的正确位置的方法称为: (A)
A. 插入排序
B. 选择排序
C. 快速排序
D. 归并排序

解析:
插入排序

9、对于 10 个数的简单选择排序,最坏情况下需要交换元素的次数为: (A)
A. 9
B. 36
C. 45
D. 100
解析:

对于简单选择排序,无论最好最坏都要交换N-1次;

11、对序列{15,9,7,8,20,-1,4}进行排序,进行一趟后数据的排列变为{4,9,-1,8,20, 7,15},则用的是(B)排序法。 (3 分)
A. 快速
B. 希尔
C. 冒泡
D. 选择
解析:

增量为3的希尔排序

12、对初始数据序列{ 8, 3, 9, 11, 2, 1, 4, 7, 5, 10, 6 }进行希尔排序。若第一趟排序结果为( 1, 3, 7, 5, 2, 6, 4, 9, 11, 10, 8 ),第二趟排序结果为( 1, 2, 6, 4, 3, 7, 5, 8, 11, 10, 9 ),则两趟排序采用的增量(间隔)依次是: (D)
A. 3, 1
B. 3, 2
C. 5, 2
D. 5, 3

12、数据序列{ 3, 1, 4, 11, 9, 16, 7, 28 }只能是下列哪种排序算法的两趟排序结果?(B)
A. 冒泡排序
B. 快速排序
C. 插入排序
D. 堆排序

13、若用冒泡排序法对序列{10,14,26,29,41,52}从大到小排序,需进行()次比较。 (C )
A. 25
B. 3
C. 15
D. 10

解析:

5+4+3+2+1=15;

n(n-1)/2;//n为序列个数;

14、O(nlogn) 快速对于快速排序,当待排记录有序时,每回划分均以第一个元素作为枢轴,如下说法正确的
是: (C )
A. 适用于顺序存储结构,算法时间复杂度时 O(N)
B. 适用于链式存储结构,算法时间复杂度时 O(N)
C. 适用于顺序存储结构,算法时间复杂度时 O(N^2)
D. 适用于链式存储结构,算法时间复杂度时 O(N^2)

解析:

适用于顺序存储结构,有序时最坏,时间复杂度时 O(N^2);

14、O(nlogn) 快速对于快速排序,当待排记录有序时,每回划分均以第一个元素作为枢轴,如下说法正确的
是: (C )
A. 适用于顺序存储结构,算法时间复杂度时 O(N)
B. 适用于链式存储结构,算法时间复杂度时 O(N)
C. 适用于顺序存储结构,算法时间复杂度时 O(N^2)
D. 适用于链式存储结构,算法时间复杂度时 O(N^2)

解析:

适用于顺序存储结构,有序时最坏,时间复杂度时 O(N^2);

三、填空题

1、基于比较的排序方法,其最好的时间复杂度为 ( n l o g 2 n nlog_2n nlog2n)。

2、时间复杂度为 O(nlogn)的排序算法有归并排序、堆排序和 (快速)排序。

  • 30
    点赞
  • 122
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值