摘要:
2.3.19附加题:找到一种对于任意输入都只需要少于7次比较的五取样算法。答:设有5个数,a,b,c,d,e,若这5个数有序,那么中位数为c,c的特点是它只大于两个数。设a,b,c,d,e为任意排列情况,按下面的步骤可以在6次比较时得到中位数1)用d与e比较,当d>e时,交换d,e得到d<e。2) 阅读全文
摘要:
2.3.19五取样切分。实现一种基于随机抽取子数组中5个元素并取中位数进行切分的快速排序。将取样元素放在数组的一侧以保证只有中位数元素参与了切分。运行双倍测试来确定这样改动的效果,并和标准的快速排序以及三取样切分的快速排序(请见上一道练习)进行比较。附加题:找到一种对于任意输入都只需要少于7次比较的 阅读全文
摘要:
2.3.18三取样切分。为快速排序实现正文所述的三取样切分(参见2.3.3.2节)。运行双倍测试来确认这项改动的效果。public class E2d3d18{ public static void sort(Comparable[] a) { StdRandom.shuffle(a); sort( 阅读全文
摘要:
2.3.17哨兵。修改算法2.5,去掉内循环while中的边界检查。由于切分元素本身就是一个哨兵(v不可能小于a[lo]),左侧边界的检查是多余的。要去掉另一个检查,可以在打乱数组后将数组的最大元素放在a[length-1]中。该元素永远不会移动(除非和相等的元素交换),可以在所有包含它的子数组中成 阅读全文
摘要:
2.3.16最佳情况。编写一段程序来生成使算法2.5中的sort()方法表现最佳的数组(无重复无素):数组大小为N且不包含重复元素,每次切分后两个子数组的大小最多差1(子数组的大小与含有N个相同元素数组的切分情况相同)。(对于这道练习,我们不需要在排序开始时打乱数组。)以下练习描述了快速排序的几个变 阅读全文
摘要:
2.3.15螺丝和螺帽。(G.J.E.Rawlins)假设有N个螺丝和N个螺帽混在一堆,你需要快速将它们配对。一个螺丝只会匹配一个螺帽,一个螺帽也只会匹配一个螺丝。你可以试着把一个螺丝和一个螺帽拧在一起看看谁大,但不能直接比较两个螺丝或者两个螺帽。给出一个解决这个问题的有效方法。1) 将螺丝与螺帽分 阅读全文
摘要:
2.3.14证明在用快速排序处理大小为N的不重复数组时,比较第i大和第j大元素的概率为2/(j-i),并用该结论证明命题K。 证:设数组子集Zij={Zi,Zi+1,Zi+2,....Zj}并且Zi<Zi+1<Zi+2<...<Zj。 由于元素只与切分元素进行对比 1)当切分元素V为Zi+1...至 阅读全文
摘要:
2.3.12按照代码所示轨迹的格式给出信息量最佳的快速排序第一次是如何切分数组BABABABACADABRA的。答:即为Dijkstra三向切分快速排序的轨迹, 这种方式在大交换时可能会出现大值与大值交换的情况,这样又会多一次交换。 2.3.12按照代码所示轨迹的格式给出信息量最佳的快速排序第一次是 阅读全文
摘要:
2.3.13在最佳、平均和最坏情况下,快速排序的递归深度分别是多少?这决定了系统为了追踪递归调用所需的栈的大小。在最坏情况下保证递归深度为数组大小的对数级的方法请见练习2.3.20。答:令排序数组长度为n1)最佳情况下,每次切分都能使左右子数组长度相同,递归深度为lgN。2)平均情况下,递归深度为l 阅读全文
摘要:
2.3.11假如在遇到和切分元素重复的元素时我们继续扫描数组而不是停下来,证明使用这种方法的快速排序在处理只有若干种元素值的数组时的运行时间是平方级别的。答:在有重复元素的情况下,一轮比较与交换后,与切分元素同值的元素仍就保持在原有位置,切分元素移动到分界位置,得到的排序结果为左子数组<=切分元素< 阅读全文