数据结构 排序 思考题 3

全部每周作业和视频思考题答案和解析 见 浙江大学 数据结构 思考题+每周练习答案

题目一:什么是快速排序算法的最好情况?

  • 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. ×

我们思考一下视频中讲解的关于某一步:

数据结构 排序 思考题 3_第1张图片

当有元素正好等于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

你可能感兴趣的:(算法)