左区间中元素的个数为( )。
A. 2 B. 3 C. 4 D. 5
18. 在对n个元素进行简单选择排序的过程中,需要进行( )趟选择和交换。 A. n B. n+1 C. n-1 D. n/2 19. 在对n个元素进行堆排序的过程中,时间复杂度为( )。
2
A. O(1) B. O(log2n) C. O(n) D. O(nlog2n) 20. 在对n个元素进行堆排序的过程中,空间复杂度为( )。
2
A. O(1) B. O(log2n) C. O(n) D. O(nlog2n)
21. 假定对元素序列(7, 3, 5, 9, 1, 12)进行堆排序,并且采用小根堆,则由初始数据构成的初始堆为( )。
A. 1, 3, 5, 7, 9, 12 B. 1, 3, 5, 9, 7, 12 C. 1, 5, 3, 7, 9, 12 D. 1, 5, 3, 9, 12, 7
22. 假定一个初始堆为(1, 5, 3, 9, 12, 7, 15, 10),则进行第一趟堆排序后得到的结果为( )。
A. 3, 5, 7, 9, 12, 10, 15, 1 B. 3, 5, 9, 7, 12, 10, 15, 1 C. 3, 7, 5, 9, 12, 10, 15, 1 D. 3, 5, 7, 12, 9, 10, 15, 1 23. 若对n个元素进行归并排序,则进行归并的趟数为( )。
A. n B. n-1 C. n/2 D. ?log2n? 24. 若一个元素序列基本有序,则选用( )方法较快。 A. 直接插入排序 B. 简单选择排序 C. 堆排序 D. 快速排序
25. 若要从1000个元素中得到10个最小值元素,最好采用( )方法。 A. 直接插入排序 B. 简单选择排序 C. 堆排序 D. 快速排序
26. 若要对1000个元素排序,要求既快又稳定,则最好采用( )方法。 A. 直接插入排序 B. 归并排序 C. 堆排序 D. 快速排序
27. 若要对1000个元素排序,要求既快又节省存储空间,则最好采用( )方法。 A. 直接插入排序 B. 归并排序 C. 堆排序 D. 快速排序 28. 在平均情况下速度最快的排序方法为( )。
A. 简单选择排序 B. 归并排序 C. 堆排序 D. 快速排序 二、填空题
1. 每次从无序子表中取出一个元素,把它插入到有序子表中的适当位置,此种排序方法叫做________排序;每次从无序子表中挑选出一个最小或最大元素,把它交换到有序表的一端,此种排序方法叫做________排序。
2.每次直接或通过支点元素间接比较两个元素,若出现逆序排列时就交换它们的位置,此种排序方法叫做________排序;每次使两个相邻的有序表合并成一个有序表的排序方法叫做________排序。
3.在简单选择排序中,记录比较次数的时间复杂度为________,记录移动次数的时间复杂度为________。
4. 对n个记录进行冒泡排序时,最少的比较次数为________,最少的趟数为_______。 5. 快速排序在平均情况下的时间复杂度为________,在最坏情况下的时间复杂度为________。
6. 若对一组记录(46,79,56,38,40,80,35,50,74)进行直接插入排序,当把第8个记录插入到前面已排序的有序表时,为寻找插入位置需比较________次。
7. 假定一组记录为(46,79,56,38,40,84),则利用堆排序方法建立的初始小根堆为____________________。
8. 假定一组记录为(46,79,56,38,40,84),在冒泡排序的过程中进行第一趟排序后的结果为____________________。
9. 假定一组记录为(46,79,56,64,38,40,84,43),在冒泡排序的过程中进行第一趟排序时,元素79将最终下沉到其后第_______个元素的位置。
10. 假定一组记录为(46,79,56,38,40,80),对其进行快速排序的过程中,共需要________趟排序。
11. 假定一组记录为(46,79,56,38,40,80),对其进行快速排序的过程中,含有两个或两个以上元素的排序区间的个数为________个。
12. 假定一组记录为(46,79,56,25,76,38,40,80),对其进行快速排序的第一次划分后,右区间内元素的个数为__________。
13. 假定一组记录为(46,79,56,38,40,80),对其进行快速排序的第一次划分后的结果为____________________。
14. 假定一组记录为(46,79,56,38,40,80,46,75,28,46),对其进行归并排序的过程中,第二趟归并后的子表个数为________________。
15. 假定一组记录为(46,79,56,38,40,80,46,75,28,46),对其进行归并排序的过程中,第三趟归并后的第2个子表为________________。
16. 假定一组记录为(46,79,56,38,40,80,46,75,28,46),对其进行归并排序的过程中,供需要__________趟完成。
17. 在时间复杂度为O(nlog2n)的所有排序方法中,________排序方法是稳定的。
2
18. 在时间复杂度为O(n)的所有排序方法中,________排序方法是不稳定的。 19. 在所有排序方法中,________排序方法采用的是二分法的思想。
20. 在所有排序方法中,________方法使数据的组织采用的是完全二叉树的结构。 21. 在所有排序方法中,________方法采用的是两两有序表合并的思想。 22. ________排序方法使键值大的记录逐渐下沉,使键值小的记录逐渐上浮。 23. ________排序方法能够每次使无序表中的第一个记录插入到有序表中。 24. ________排序方法能够每次从无序表中顺序查找出一个最小值。 三、应用题
1. 已知一组记录为(46,74,53,14,26,38,86,65,27,34),给出采用直接插入排序法进行排序时每一趟的排序结果。
2. 已知一组记录为(46,74,53,14,26,38,86,65,27,34),给出采用冒泡排序法进行排序时每一趟的排序结果。
3. 已知一组记录为(46,74,53,14,26,38,86,65,27,34),给出采用快速排序法进行排序时每一趟的排序结果。
4. 已知一组记录为(46,74,53,14,26,38,86,65,27,34),给出采用简单选择排序法进行排序时每一趟的排序结果。
5. 已知一组记录为(46,74,53,14,26,38,86,65,27,34),给出采用堆排序法进行排序时每一趟的排序结果。
6. 已知一组记录为(46,74,53,14,26,38,86,65,27,34),给出采用归并排序法进行排序时每一趟的排序结果。 四、算法设计题
1. 编写一个双向起泡的排序算法,即相邻两趟向相反方向起泡。 2. 试以单链表为存储结构实现简单选择排序的算法。
习题8参考答案
一、单项选择题
1. D 2. B 3. C 4. C 5. B 6. D 7. A 8. B 9. D 10. C 11. B 12. D 13. C 14. D 15. A 16. D 17. B 18. C 19. D 20. A 21. B 22. A 23. D 24. A 25. B 26. B 27. C 28. D 二、填空题
1. 插入,选择 2. 快速,归并 3. O(n2),O(n) 4. n-1,1 5. O(nlog2n),O(n2) 6. 4
7. (38,40,56,79,46,84) 8. (46,56,38,40,79,84) 9. 4 10. 3
11. 4 12. 4 13.[40 38] 46 [56 79 80] 14.3 15. [28 46] 16. 4 17. 归并 18. 直接选择 19. 快速 20. 堆排序 21. 归并排序 22. 冒泡 23. 直接插入 24. 直接选择 三、应用题
1.
(0) [46] 74 53 14 26 38 86 65 27 34 (1) [46 74] 53 14 26 38 86 65 27 34 (2) [46 53 74] 14 26 38 86 65 27 34 (3) [14 46 53 74] 26 38 86 65 27 34 (4) [14 26 46 53 74] 38 86 65 27 34 (5) [14 26 38 46 53 74] 86 65 27 34 (6) [14 26 38 46 53 74 86] 65 27 34 (7) [14 26 38 46 53 65 74 86] 27 34 (8) [14 26 27 38 46 53 65 74 86] 34 (9) [14 26 27 34 38 46 53 65 74 86] 2.
(0) [46 74 53 14 26 38 86 65 27 34] (1) [46 53 14 26 38 74 65 27 34] 86 (2) [46 14 26 38 53 65 27 34] 74 86 (3) [14 26 38 46 53 27 34] 65 74 86 (4) [14 26 38 46 27 34] 53 65 74 86 (5) [14 26 38 27 34] 46 53 65 74 86 (6) [14 26 27 34] 38 46 53 65 74 86 (7) [14 26 27 34] 38 46 53 65 74 86 3.
(0) [46 74 53 14 26 38 86 65 27 34] (1) [34 27 38 14 26] 46 [86 65 53 74] (2) [26 27 14] 34 38 46 [74 65 53] 86 (3) 14 26 27 34 38 46 [53 65] 74 86 (4) 14 26 27 34 38 46 53 65 74 86 4.
(0) [46 74 53 14 26 38 86 65 27 34] (1) 14 [74 53 46 26 38 86 65 27 34] (2) 14 26 [53 46 74 38 86 65 27 34] (3) 14 26 27 [46 74 38 86 65 53 34] (4) 14 26 27 34 [74 38 86 65 53 46] (5) 14 26 27 34 38 [74 86 65 53 46] (6) 14 26 27 34 38 46 [86 65 53 74] (7) 14 26 27 34 38 46 53 [65 86 74] (8) 14 26 27 34 38 46 53 65 [86 74] (9) 14 26 27 34 38 46 53 65 74 [86] 5. 构成初始堆(即建堆)的过程:
1 2 3 4 5 6 7 8 9 10 (0) 46 74 53 14 26 38 86 65 27 34 (1) 46 74 53 14 26 38 86 65 27 34 (2) 46 74 53 14 26 38 86 65 27 34 (3) 46 74 38 14 26 53 86 65 27 34 (4) 46 14 38 27 26 53 86 65 74 34 (5) 14 26 38 27 34 53 86 65 74 46 进行堆排序的过程:
(0) 14 26 38 27 34 53 86 65 74 46 (1) 26 27 38 46 34 53 86 65 74 [14] (2) 27 34 38 46 74 53 86 65 [26 14] (3) 34 46 38 65 74 53 86 [27 26 14] (4) 38 46 53 65 74 86 [34 27 26 14] (5) 46 65 53 86 74 [38 34 27 26 14] (6) 53 65 74 86 [46 38 34 27 26 14] (7) 65 86 74 [53 46 38 34 27 26 14] (8) 74 86 [65 53 46 38 34 27 26 14] (9) 86 [74 65 53 46 38 34 27 26 14] 6.
(0) [46] [74] [53] [14] [26] [38] [86] [65] [27] [34] (1) [46 74] [14 53] [26 38] [65 86] [27 34] (2) [14 46 53 74] [26 38 65 86] [27 34] (3) [14 26 38 46 53 65 74 86] [27 34] (3) [14 26 27 34 38 46 53 65 74 86] 四、算法设计题 1.
void Bubble_Sort2(int a[ ],int n) //相邻两趟是反方向起泡的冒泡排序算法 { low=0;high=n-1; //冒泡的上下界 change=1;
while (low for(i=low;i high--; //修改上界 for (i=high;i>low;i--) //从下向上起泡 if (a[i]a[i-1]; change=1; } low++; //修改下界 }//while }//Bubble_Sort2 2. void LinkList_Select_Sort(LinkList &L) //单链表上的简单选择排序算法 { for (p=L;p->next->next;p=p->next) { q=p->next; x=q->data; for (r=q,s=q;r->next;r=r->next) //在q后面寻找元素值最小的结点 if (r->next->data if (s!=q) //找到了值比q->data更小的最小结点s->next { p->next=s->next; s->next=q; t=q->next; q->next=p->next->next; p->next->next=t; } //交换q和s->next两个结点 }//for }//LinkList_Select_Sort 图5-5