数据结构 -排序(详解)

选择题

1.从未排序序列中依次取出元素与已排序序列中的元素进行比较,将其放入已排序序列的正确位置上的方法,这种排序方法称为(   )。

A.归并排序       B.冒泡排序        C.插入排序        D.选择排序 

答案:C(如 打扑克牌)

2.从未排序序列中挑选元素,并将其依次放入已排序序列(初始时为空)的一端的方法,称为(   )。

A.归并排序       B.冒泡排序        C.插入排序        D.选择排序 

答案:D(每一趟从待排序的记录中选出关键字最小的记录,按顺序放在已排序的记录序列的最后,知道全部排完为止)

3.对n个不同的关键字由小到大进行冒泡排序,在下列(   )情况下比较的次数最多。

A.从小到大排列好的                 B.从大到小排列好的    

 C.元素无序                          D.元素基本有序

答案:B 解释:对关键字进行冒泡排序,关键字逆序时比较次数最多。

4.对n个不同的排序码进行冒泡排序,在元素无序的情况下比较的次数最多为(   )。

A.n+1            B.n               C.n-1             D.n(n-1)/2

答案:D 解释:比较次数最多时,第一次比较n-1次,第二次比较n-2次……最后一次比较1次,即(n-1)+(n-2)+…+1= n(n-1)/2。

5.快速排序在下列(   )情况下最易发挥其长处。

A.被排序的数据中含有多个相同排序码   

B.被排序的数据已基本有序   

C.被排序的数据完全无序         

D.被排序的数据中的最大值和最小值相差悬殊

答案:C 解释:B选项是快速排序的最坏情况。随机快排的性质就是不希望数据有序,当数据无序时,可以实现nlog2n

6.对n个关键字作快速排序,在最坏情况下,算法的时间复杂度是(   )。

A.O(n)           B.O(n2)           C.O(nlog2n)         D.O(n3) 

答案:B 解释:快速排序的平均时间复杂度为O(nlog2n),但在最坏情况下,即关键字基本排好序的情况下,时间复杂度为O(n2)。

7.若一组记录的排序码为(46, 79,56,38,40,84),则利用快速排序的方法,以第一个记录为基准得到的一次划分结果为(   )。

A.38,40,46,56,79,84              B.40,38,46,79,56,84

C.40,38,46,56,79,84               D.40,38,46,84,56,79

答案:C

8.下列关键字序列中,(   )是堆。

A.16,72,31,23,94,53               B.94,23,31,72,16,53 

C.16,53,23,94,31,72               D.16,23,53,31,94,72

答案:D

解释:D选项为小根堆(

堆是完全二叉树,根据父节点和子节点的关系,可以分为大根堆和小根堆。

大根堆的父节点比它的所有子节点大,小根堆的父节点比它的所有子节点小。

兄弟节点间不按大小排序。

9.堆是一种(   )排序。

A.插入         B.选择         C.交换         D.归并

答案:B

10.堆的形状是一棵(   )。

A.二叉排序树   B.满二叉树     C.完全二叉树    D.平衡二叉树

答案:C

11.若一组记录的排序码为(46,79,56,38,40,84),则利用堆排序的方法建立的初始堆为(   )。

A.79,46,56,38,40,84               B.84,79,56,38,40,46         

C.84,79,56,46,40,38              D.84,56,79,40,46,38

答案:B

12.下述几种排序方法中,要求内存最大的是(   )。

A.希尔排序        B.快速排序        C.归并排序       D.堆排序

答案:C  解释:堆排序、希尔排序的空间复杂度为O(1),快速排序的空间复杂度为O(log2n),归并排序的空间复杂度为O(n)。

13.下述几种排序方法中,(   )是稳定的排序方法。

A.希尔排序        B.快速排序        C.归并排序       D.堆排序

答案:C

解释:不稳定排序有希尔排序、简单选择排序、快速排序、堆排序;稳定排序有直接插入排序、折半插入排序、冒泡排序、归并排序、基数排序。

14.数据表中有10000个元素,如果仅要求求出其中最大的10个元素,则采用(    )算法最节省时间。

A.冒泡排序        B.快速排序        C.简单选择排序   D.堆排序

答案:D  
这是一个top K问题。(面试还是算法常用的)

解法:开始建立一个含有k个元素的最小堆或者最大堆,然后从第k+1个数开始依次与堆顶元素比较,进行调整最小堆或者最大堆,直到把n个数据遍历完;其时间复杂度为O(nklogk),空间复杂度为k(常数)。

15.设有n(n为大于10000的整数)个无序元素,希望用最快速度从中选择前k(1≤k≤n)个关键字最小的元素,在以下排序方法中应选择______。

A. 快速排序

B. 希尔排序

C. 二路归并排序

D. 直接插入排序

答案 A. 快速排序

16.下列排序算法中,(   )不能保证每趟排序至少能将一个元素放到其最终的位置上。

A.希尔排序        B.快速排序        C.冒泡排序       D.堆排序

答案:A  解释:快速排序的每趟排序能将作为枢轴的元素放到最终位置;冒泡排序的每趟排序能将最大或最小的元素放到最终位置;堆排序的每趟排序能将最大或最小的元素放到最终位置,希尔排序由于是按照增量排序,步长不同可能元素不一定到他最终位置。(看书中例子就知道了)

17.下列排序方法中,______ 在一趟结束后不一定能选出一个元素放在其最终位置上。

A. 简单选择排序

B. 冒泡排序

C. 二路归并排序

D. 堆排序

答案 C. 二路归并排序(

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。    所以每一趟选择的元素都会放在他的最终位置

冒泡排序, 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。比如按照升序排序则每一趟会将前面未排序部分的最大的往后交换到已排序的最前面,为其最终位置

堆排序如果要求升序则建立大根堆,降序则建立小根堆,堆顶元素为最大或者最小的元素,将这个元素与最后一个位置的元素交换,再将剩余元素还原成大小跟堆,每一趟都会选出一个未排序中的最大或者最小放大他的最终位置

)

18.整数序列(3,2,4,1,5,6,8,7)是第一趟递增排序后的结果,则采用的排序方法可能是______。

A. 快速排序

B. 冒泡排序

C. 堆排序

D. 简单选择排序

答案 A. 快速排序   左边数均小于5 右边大于5

19.整数序列(5,4,15,10,3,2,9,6,1)是某排序方法第一趟后的结果,该排序算法可能是______。

A. 冒泡排序

B. 二路归并排序

C. 堆排序

D. 简单选择排序

答案 B. 二路归并排序(每两个数,都比较出来了一个最大的,最后一个直接写下,等第二次比较)

20.数据序列(8,9,10,4,5,6,20,1,2)只能是______ 算法的两趟排序后的结果。

A. 简单选择排序

B. 冒泡排序

C. 直接插入排序

D. 堆排序

答案 C. 直接插入排序  冒泡和选择类似,都是第一第二个是最小和次小。堆排序每趟可以都会选出一个未排序中的最大或者最小

21.以下排序方法中,______ ,在初始序列已基本有序的情况下,排序效率最高。

A. 冒泡排序

B. 直接插入排序

C. 快速排序

D. 堆排序

答案 B. 直接插入排序

22.在二路归并排序中归并的趟数是______。

A. n

B. log2n

C. log2n+1

D. n2

答案 B. log2n

23.有一个整数序列为(15,9,7,8,20,-1,7,4),用堆排序的筛选方法建立的初始堆为______。

A. (-1,4,8,9,20,7,15,7)

B. (-1,7,15,7,4,8,20,9)

C. (-1,4,7,8,20,15,7,9)

D. 以上都不对

答案 C (根据答案可以看处建立的是小根堆,)

24.以下序列不是堆的是______。

A. (100,85,98,77,80,60,82,40,20,10,66)

B. (100,98,85,82,80,77,66,60,40,20,10)

C. (10,20,40,60,66,77,80,82,85,98,100)

D. (100,85,40,77,80,60,66,98,82,10,20)

答案 D. (100,85,40,77,80,60,66,98,82,10,20)(依次画出4个选项的图,会发现A B C不是大根堆就是小根堆 ,而D选项啥也不是)

25.2n个不同的元素选择其中最小元素所需关键字比较次数最少是______次。

A. n

B. 2n

C. 2n-1

D. n-1

答案 C. 2n-1

26.对有n个元素的顺序表进行直接插入排序,在最坏情况下需比较______ 次关键字。

A. n-1

B. n+1

C. n/2

D. n(n-1)/2

答案 D. n(n-1)/2(最坏情况就是逆序情况下n(n-1)/2,最好情况就是顺序情况下,n-1次)

27.某顺序表含有6个元素,采用直接插入排序算法进行排序,则最坏情况和最好情况所需比较的次数分别为()

A.15,3
B.15,5
C.7,5
D.7,3

答案 B 

最坏的情况是逆序排列,需要1+2+3+4+5+6=15次; n(n-1)/2

最好的情况是顺序排列,需要1+1+1+1+1=5次。(即可由上一题的公式直接算出)(综合了25 26题)

28.下列排序算法中元素的移动次数和关键字的初始排列次序无关的是()。

A.直接插入排序
B.起泡排序
C.快速排序
D.基数排序

答案 D  

元素的移动次数与关键字的初始排列次序无关的是:基数排序

元素的比较次数与初始序列无关是:选择排序

算法的时间复杂度与初始序列无关的是:选择排序

29.在一般情况下,以下排序算法中元素移动次数最少的______。

A. 直接插入排序

B. 冒泡排序

C. 简单选择排序

D. 都一样

答案 C. 简单选择排序

30.以下关于快速排序的叙述中正确的是______。

A. 快速排序在所有排序方法中为最快,而且所需辅助空间也最少

B. 在快速排序中,不可以用队列替代栈

C. 快速排序的空间复杂度为O(n)

D. 快速排序在待排序的数据随机分布时效率最高

答案 D. 快速排序在待排序的数据随机分布时效率最高

31.对关键字序列(28,16,32,12,60,2,5,72)进行快速排序,第一趟从小到大一次划分结果为______。

A. (2,5,12,16) 28 (60 32 72)

B. (5,16,2,12) 28 (60,32,72)

C. (2,16,12,5) 28 (60,32,72)

D. (5,16,2,12) 28 (32,60,72)


答案 B. (5,16,2,12) 28 (60,32,72)

32.对一组数据(2,12,16,88,5,10)进行排序,若前三趟的结果如下: 第一趟:2,12,16,5,10,88 第二趟:2,12,5,10,16,88 第三趟:2,5,10,12,16,88 则采用的排序方法可能是______。

A. 冒泡排序

B. 希尔排序

C. 二路归并排序

D. 基数排d

答案 A. 冒泡排序 冒泡排序每一趟都会保证最大元素就位
希尔排序每一趟会使以w为间隔的元素有序
归并排序则是依次保证以1、2、4、8…为块划分的局部有序
基数排序每一趟保证各个数对应的位从低位到高位有序

33.对整数序列(8,9,10,4,5,6,20,1,2)进行递增排序,采用每趟冒出一个最小元素的冒泡排序算法,需要进行的趟数是______。

A. 3

B. 4

C. 6

D. 8

答案 C. 6

34.对同一待排序序列分别进行折半插入排序和直接插入排序,两者之间可能的不同之处是______。

A. 排序的总趟数

B. 元素的移动次数

C. 使用辅助空间的数量

D. 元素之间的比较次数

答案 D. 元素之间的比较次数

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

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

答案 A归并排序 

36.在下列排序算法中,在待排序的数据表已经为有序时,花费时间反而最多的是()

A 快速排序  B  希尔排序   C 冒泡排序   D堆排序.

答案 A 快速排序 (

快速排序是把数列按一个枢纽值分成两部分分别排序,所以效率高。但是若原数据为有序,并且选择的枢纽值为第一个数时,那在分块时会将一个第一个数前面的数(也就是没有)分为一块,将除第一个数的所有数分成了另一块。这样一来,每一次分块都只减少了一个值,而每次分块的时间为O(N),所以总时间为O(N^2)。)
快排在无序时是最快的内部排序算法

简答题

1.不受待排序初始序列的影响,时间复杂度为 O(N2)的排序算法是 _____,在排序算法的最后一趟开始之前,所有元素都可能不在其最终位置上的排序算法是_____。

【答案】简单排序;选择排序。

2. 直接插入排序用监视哨的作用是_____ 。

【答案】免去查找过程中每一步都要检测整个表是否查找完毕,提高了查找效率。

3. 查找是非数值程序设计的一个重要技术问题,基本上分成_____,_____和_____。处理哈希冲突的方法有_____ 、_____ 、_____和_____。

【答案】顺序表查找;树表查找;哈希表查找;开放定址方法;链地址方法;再哈希法;建立公共溢出区。
 

堆排序是一种树形选择排序

应用题

(1)设待排序的关键字序列为{12,2,16,30,28,10,16*,20,6,18},试分别写出使用以下排序方法,每趟排序结束后关键字序列的状态。

① 直接插入排序

② 折半插入排序

③ 希尔排序(增量选取5,3,1)

④ 冒泡排序

⑤ 快速排序

⑥ 简单选择排序

⑦ 堆排序

⑧ 二路归并排序

答案:

①直接插入排序

[2    12]   16   30   28   10   16*   20   6    18         

[2    12    16]  30   28   10   16*   20   6    18         

[2    12    16   30]  28   10   16*   20   6    18         

[2    12    16   28   30]  10   16*   20   6    18         

[2    10    12   16   28  30]   16*   20   6    18         

[2    10    12   16   16*  28   30]   20   6    18         

[2    10    12   16   16*  20   28   30]   6    18         

[2    6     10   12   16  16*   20   28   30]   18         

[2    6     10   12   16  16*    18   20   28   30]

② 折半插入排序 排序过程同①

③ 希尔排序(增量选取5,3,1)

10   2    16   6    18   12   16*   20  30    28 (增量选取5)

6    2    12   10   18   16   16*   20  30    28 (增量选取3)

2    6    10   12   16   16*  18      20  28    30 (增量选取1)

④ 冒泡排序

2    12   16    28   10   16*  20   6     18   [30]        

2    12   16    10   16*  20   6    18    [28   30]        

2    12   10    16   16*  6     18   [20   28   30]          

2    10   12    16   6   16*    [18   20   28   30]          

2    10   12    6   16   [16*    18   20   28   30]         

2    10   6    12   [16   16*    18   20   28   30]        

2    6   10    [12   16   16*    18   20   28   30]

2    6   10    12   16   16*    18   20   28   30]       

⑤ 快速排序

12  [6    2  10]  12  [28  30  16*  20   16  18]          

6   [2]  6  [10] 12 [28  30  16*  20   16  18 ]         

28  2    6   10   12 [18  16  16*  20 ]28  [30 ]       

18  2   6   10  12   [16*  16] 18 [20]  28  30          

16*     2   6   10  12   16* [16]   18  20   28  30

左子序列递归深度为1,右子序列递归深度为3

⑥ 简单选择排序

2    [12   16   30   28   10   16*   20   6    18]          

2    6    [16   30   28   10   16*   20   12   18]          

2    6    10   [30   28   16   16*   20   12   18]          

2    6    10   12   [28   16   16*   20   30   18]          

2    6    10   12   16   [28   16*   20   30   18]          

2    6    10   12   16   16*    [28  20   30   18]          

2    6    10   12   16   16*   18   [20   30   28]         

2    6    10   12   16   16*   18    20   [28  30]         

2    6    10   12   16   16*    18   20   28   [30]

⑧ 二路归并排序

2 12    16 30    10 28    16 * 20    6 18                                                

2 12 16 30        10 16* 20 28      6 18                                               

2 10 12 16 16* 20 28 30   6 18                                               

2 6 10 12 16 16* 18 20 28 30

(2)给出如下关键字序列{321,156,57,46,28,7,331,33,34,63},试按链式基数排序方法,列出每一趟分配和收集的过程。

答案:

按最低位优先法  →321→156→57→46→28→7→331→33→34→63

      分配 [0] [1] [2] [3] [4] [5] [6] [7] [8] [9]

               321     33   34     156  57  28

               331     63           46   7

收集  →321→331→33→63→34→156→46→57→7→28

(3)对输入文件(101,51,19,61,3,71,31,17,19,100,55,20,9,30,50,6,90);当k=6时,使用置换-选择算法,写出建立的初始败者树及生成的初始归并段。

答案:

       

初始归并段:R1:3,19,31,51,61,71,100,101

            R2:9,17,19,20,30,50,55,90

  R3:6
 

  • 8
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据结构算法是计算机科学非常重要的两个概念。数据结构是一种组织和存储数据的方式,而算法是解决问题的步骤和方法。在计算机科学,有许多经典的数据结构算法,被广泛应用于各种领域。 以下是十大经典数据结构算法的简要介绍: 1. 数组(Array):是一种线性数据结构,可以存储相同类型的元素。数组的访问速度快,但插入和删除操作较慢。 2. 链表(Linked List):也是一种线性数据结构,由节点组成,每个节点包含数据和指向下一个节点的指针。链表适用于频繁的插入和删除操作。 3. 栈(Stack):是一种后进先出(LIFO)的数据结构,只能在栈顶进行插入和删除操作。 4. 队列(Queue):是一种先进先出(FIFO)的数据结构,只能在队尾插入,在队头删除。 5. 树(Tree):是一种非线性数据结构,由节点和边组成。树有许多种类型,如二叉树、平衡树、堆等。 6. 图(Graph):也是一种非线性数据结构,由节点和边组成。图可以表示各种实际问题,如网络、社交关系等。 7. 哈希表(Hash Table):使用哈希函数将数据存储在数组,可以快速查找、插入和删除数据。 8. 排序算法(Sorting Algorithm):如冒泡排序、插入排序、快速排序等,用于将数据按照某种规则进行排序。 9. 查找算法(Search Algorithm):如线性查找、二分查找等,用于在数据集查找特定元素。 10. 图算法(Graph Algorithm):如最短路径算法(Dijkstra算法)、深度优先搜索算法(DFS)、广度优先搜索算法(BFS)等,用于解决图相关的问题。 以上是十大经典数据结构算法的简要介绍,每个数据结构算法都有其特点和适用场景,深入学习它们可以帮助我们更好地理解和解决实际问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值