排序算法杂记

来源:互联网 发布:斯巴鲁 知乎 编辑:程序博客网 时间:2024/05/11 04:49

一、排序算法

1、精简排序,即一对数字不进行两次和两次以上的比较,以下是“精简排序”的是

正确答案: A B

A、插入排序
B、归并排序
C、选择排序
D、堆排序

插入排序:前面是有序的,后面的每一个元素与前面有序的元素比较,比较过的就是有序的了,不会再比较一次,例如:3 2 1 5
第一趟:【2,3,1,5】,2和3比较,3后移;第二趟:【1,2,3,5】,1和2,1和3比较,而2,3不会比较。
归并排序:每次合并后,内部都是有序的,内部的元素之间不用再比较
选择排序:每次在后面的元素中找到最小的,找最小元素的过程是在没有排好序的那部分进行,所以肯定会比较多次;
堆排序:每次要调整堆,举个例子试试,很容易看出来。

总之,只要是每次操作是在排好序的那部分元素之间操作,就符合,否则不是。

2、执行()操作时,需要使用队列做辅助存储空间
正确答案: B

A、查找哈希(Hash)表
B、广度优先搜索网
C、前序(根)遍历二叉树
D、深度优先搜索网

3、以下哪种排序算法对[1, 3, 2, 4, 5, 6, 7, 8, 9]进行排序最快
正确答案: A

A、改良的冒泡排序
B、快速排序
C、归并排序
D、堆排序

改良的冒泡排序,当一轮循环中没有交换就结束排序。只要2轮循环。

4、下面哪种排序的平均比较次数最少()
正确答案: D

插入排序
选择排序
堆排序
快速排序

虽然平均情况下快排和堆排时间复杂度都为O(nlogn),甚至堆排序的最坏情况下时间复杂度和辅助空间都优于快排。但是不能否认的是,虽然都是O(nlogn)级别,但是快排的常数因子要小于堆排序。实验可验。
这里写图片描述

5、KMP算法下,长为n的字符串中匹配长度为m的子串的复杂度为O(M+N)。

KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法。简单匹配算法的时间复杂度为O(m*n);而KMP算法,可以证明它的时间复杂度为O(m+n)

6、B+树插入操作的平均时间复杂度为0(log n),最坏时间复杂度为0(log n)。

7、
这里写图片描述

8、外部排序指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序整个文件的目的。外部排序最常用的算法是多路归并排序,即将原文件分解成多个能够一次性装入内存的部分,分别把每一部分调入内存完成排序。然后,对已经排序的子文件进行多路归并排序。

9、快速排序

属于内部排序,快速排序的实现基于分治法,具体分为三个步骤。假设待排序的序列为L[m..n]。

分解:序列L[m .. n]被划分成两个可能为空的子序列L[m .. pivot-1]和L[pivot+1 .. n],使L[m .. pivot-1]的每个元素均小于或等于L[pivot],同时L[pivot+1.. n]的每个元素均大于L[pivot]。其中L[pivot]称为这一趟分割中的主元(也称为枢轴、支点)。

解决:通过递归调用快速排序,对子序列L[m .. pivot-1]和L[pivot+1 .. r]排序。

合并:由于两个子序列是就地排序的,所以对它们的合并不需要操作,整个序列L[m .. n]已排好序。

快速排序每次将待排序数组分为两个部分,在理想状况下,每一次都将待排序数组划分成等长两个部分,则需要logn次划分。

快速排序在数据基本无序情况下优势最明显。而在最坏情况下,即数组已经有序或大致有序的情况下,每次划分只能减少一个元素,快速排序将不幸退化为冒泡排序,所以快速排序时间复杂度下界为O(nlogn),最坏情况为O(n^2)。在实际应用中,快速排序的平均时间复杂度为O(nlogn)。

10、关键码序列(Q,H,C,Y,Q,A,M,S,R,D,F,X),要按照关键码值递增的次序进行排序,若采用初始步长为4的Shell的排序法,则一趟扫描的结果是(1);若采用以第一个元素为分界元素的快速排序法,则扫描一趟的结果是 (2)。

(1)参考答案 QACSQDFXRHMY
(2)参考答案 FHCDQAMQRSYX

希尔排序,步长默认先从数组长度的一般开始,然后每次减半,直到最后为1。题目所给为4,因此,上来1,5,9号元素(即QQR)进行比较,在这三个位置上进行排序,即还是QQR。然后2,6,10号元素(即HAD)进行比较,在这三个位置上进行排序,即变成了ADH。依次排序后面的,即可获得QACSQDFXRHMY。

快排,主要看排序时,从后往前和从前往后的比较过程中,加不加等号。
以第一个元素为pivot,从后往前,遇到第一个比pivot小的,则换到前面,然后从前面开始往后遍历,遇到第一个比pivot大的则换到后面,此题答案对应的是没有等号的情况,即严格大才会换位置。
故为 FHCDQAMQRSYX。

11、若要求排序是稳定的,且关键字为实数,则在下列排序方法中应选()排序为宜
正确答案: A

直接插入
直接选择

快速
基数

解析:直接选择,堆,快速都是不稳定的,只剩下基数和直接插入。
基数排序是分别按照个位,十位,百位…进行的排序,适用于整数,这里关键字是实数,实数是浮点数,不符合要求。

12、数据序列(8,9,10,4,5,6,20,1,2)只能是下列排序算法中的()的两趟排序后的结果
正确答案: C

选择排序
起泡排序
插入排序
堆排序

解析:A. 不可能,8不是序列中的最大或最小值。选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素 中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
B.不可能,2不是最大值或最小值。 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
C. 插入排序:两趟排序后前三个是依次排序的。
D. 不可能,8不是序列中的最大或最小值。

13、无向图G=(V E),其中V={a,b,c,d,e,f},E={<a,b>,<a,e>,<a,c>,<b,e>,<c,f>,<f,d>,<e,d>}对该图进行深度优先排序,得到的顶点序列正确的是()
正确答案: D

a,b,e,c,d,f
a,c,f,e,b,d
a,e,b,c,f,d
a,e,d,f,c,b

解析:DFS深度优先遍历从一个顶点出发:依次对访问过的顶点做标记,并寻找没有访问过的相邻顶点,找直接相连的点,依次找,找到尽头时,再往回溯。若回溯到根顶点后仍有节点未被访问,且不与根顶点邻接,则更换根节点。
这里写图片描述
ABC正确答案应为:
A:abedfc
B:acfdeb
C:aebdfc

14、将整数数组(7-6-3-5-4-1-2)按照堆排序的方式原地进行升序排列,请问在第一轮排序结束之后,数组的顺序是:6-5-3-2-4-1-7

解析:一轮堆排序过程:
1)将数组转化为堆。原数组已经是一个大顶堆。
2)将A[0]与A[n - 1]交换
3)再对A[0…n-2]重新恢复堆
这里写图片描述

15、已知数据表A中每个元素距其最终位置不远,为节省时间排序,应采用什么方法排序?答案:插入排序。

解析:每个元素距其最终位置不远,说明数组已经大致有序,直接插入排序不需要移动太多元素,适用于这种情况,效率高。

16、排序趟数与序列的原始状态有关的排序方法是()排序法

正确答案: C D
插入
选择
优化的起泡
快速

解析:注意这个题问的是排序的趟数而不是时间复杂度,插入排序和选择排序不管序列的原始状态是什么都要执行n-1趟;改进的冒泡排序更不用说,设立的标志就是用来标注某一趟是否有数据交换,若无则结束排序,很显然和初始序列有关;快速排序:若是很有序,则原先需要5趟完成的,现在有可能就1趟完成了,因为它的每趟将会对所有数操作一遍,可以自己举个例子试一下,2 6 1。

但在时间复杂度方面,插入排序跟序列的原始状态是有关的,直接插入排序当序列已经有序的情况下只需要o(n)就行了。

17、设有字母序列{Q,D,F,X,A,P,N,B,Y,M,C,W},请写出按二路归并方法对该序列进行一趟扫描后的结果为:DQFXAPBNMYCW

解析:二路归并排序是 归并排序算法中,自底向上的排序算法。
第一趟:相邻两个排序。
第二趟:2与2 排序。
第三趟:4与4排序。
。。。
若某一趟归并扫描到最后,剩下的元素个数不足两个子序列的长度时:
1.若剩下的元素个数大于一个子序列的长度 t 时,则再调用一次归并子算法 merge 将剩下的两个不等长的子序列合并成一个有序子序列
2.若剩下的元素个数小于或者等于一个子序列的长度 t 时,只须将剩下的元素依次复制到前一个子序列后面。

QDFXAPNBYMCW归并扫描第一遍:两两归并,即{D,Q},{F,X},{A,P},{B,N},{M,Y},{C,W}

18、假设某算法的时间复杂度符合递推关系式T(n)=2T(n/2)+n,那么该算法的时间复杂度相当于()
正确答案: C

O(n)
O(lgn)
O(nlgn)
O(n2)
解析:由时间代价严格推出时间复杂度比较复杂,对于这种题,可用特例验证,不过需要注意的是特例不能取太少,至少n取到5,这样规律基本就可以确定了。
T(1)=1
T(2)=2T(1)+2=4
T(3)=2T(1)+3=5
T(4)=2T(2)+4=12
T(5)=2T(2)+5=13
很容易排除D选项,其递增速率介于O(n)和O(n2)之间,实际上可以参考归并排序的递推公式。

二、数学和概率

10个相同的糖果,分给三个人,每个人至少要得一个。有()种不同分法
正确答案: D

33
34
35
36
解析:10个糖果依次排开,中间有9个空挡 ,依次编号为空挡1-9,从这9个空挡中任意取出2 个作为分割点 ,正好能把糖果分为3份,并且保证每一份中至少有一个糖果。因为分割点并没有顺序,所以可以使用组合公式C(9,2)计算。

0 0
原创粉丝点击