全部每周作业和视频思考题答案和解析 见 浙江大学 数据结构 思考题+每周练习答案
题目一:什么是快速排序算法的最好情况?
A. 初始就顺序
B. 初始就逆序
C. 每次主元的位置都在数组的一端
D. 每次正好中分
感觉一开始就是顺序的情况最理想。但是难道真的这么简单?应该不对。答案C应该是最坏的情况了。考虑答案D,如果每次都中分,那么不就相当于每次递归都是折半的,所以符合分而治之中最好的情况。
所以选D。
题目二:快速排序的标准接口应该怎么写?
void Quick_Sort(ElementType A[], int N)
{
/* 这里写什么?*/
}
A. Quicksort( A, 0, N );
B. Quicksort( A, 0, N-1 );
C. Quicksort( A, 1, N );
D. Quicksort( A, 1, N-1 );
一想就知道,是B。因为我们传入到 Quicksort 的下标是0和N-1,然后开始执行第一个递归,把最小的放在0坐标位置,最大的在N-1的坐标位置,中间的放在 N-2 的位置,然后再进行递归……
题目三:快速排序是稳定的算法。
A. √
B. ×
我们思考一下视频中讲解的关于某一步:
当有元素正好等于pivot的时候,我们选择了“停下来交换”,也就是说,遇到同样的数,先后位置会发生改变。
题目四:给定A[]={46, 23, 8, 99, 31, 12, 85},调用非递归的归并排序加表排序执行第1趟后,表元素的结果是:
A. 0, 1, 2, 3, 4, 5, 6
B. 1, 0, 3, 2, 6, 5, 4
C. 1, 0, 2, 3, 5, 4, 6
D. 0, 2, 1, 4, 3, 5, 6
什么玩意,为什么还要调用非递归的归并排序?
不过可以做就是了。调用归并以后,每单独两个进行一次排序:
index = {1,0,2,3,5,4,6}
A[]={46, 23, 8, 99, 31, 12, 85}
然后执行表排序,发现表排序不需要进行交换。
所以选C
题目五: 给定A[]={23, 46, 8, 99, 31, 12, 85},调用表排序后,表元素的结果是:
A. 1, 2, 3, 4, 5, 6, 7
B. 2, 0, 3, 5, 1, 4, 6
C. 3, 6, 1, 5, 2, 7, 4
D. 2, 5, 0, 4, 1, 6, 3
index={0,1,2,3,4,5,6}
A[]={23, 46, 8, 99, 31, 12, 85}
第一次,46大于23,不用动 table[] = {0,1,2,3,4,5,6 }
第二次,8最小,所以序号到最前面:table[] = {2,0,1,3,4,5,6 }
第三次:99最大,不用动:table[] = {2,0,1,3,4,5,6 }
第四次:31一直比较到23的后面一个:table[] = {2,0,4,1,3,5,6 }
第五次:12一直比较到8的后面:table[] = {2,5,0,4,1,3,6 }
最后一次:85只比99小,所以只跟99交换:table[] = {2,5,0,4,1,6,3 }
选D