【发布时间】:2015-06-23 19:13:48
【问题描述】:
遵循 Robert Sedwick 的算法书籍中快速排序部分的文本。
通过从数组的左侧、中间和右侧选择三个元素,我们可以将哨兵合并到这个方案中。对三个元素进行排序,然后将中间的一个与a[r-1]交换,然后在a[l+1],...,a[r-2]上运行分区算法。这种改进称为三法中值。
三种方法的中位数有助于三种方式的快速排序。
这使得最坏的情况在任何实际排序中都不太可能发生。要使排序花费
O(N^2)时间,检查的三个元素中有两个必须在文件中最大或最小元素之间,并且此事件必须在大多数分区中始终如一地发生。它不需要用于分区的哨兵键,因为此功能由分区前检查的三个元素之一提供服务。
-
它将算法的总平均运行时间减少了大约 5%。
template <class Item> void exch(Item &A, Item &B) { Item t = A; A = B; B = t; } template <class Item> void compexch(Item &A, Item &B) { if (B < A) exch(A, B); } static const int M = 10; template <class Item> void quicksort(Item a[], int l, int r) { if (r-l <= M) return; exch(a[(l+r)/2], a[r-1]); // line 1 compexch(a[l], a[r-1]); // line 2. compexch(a[l], a[r]); // line 3. compexch(a[r-1], a[r]); // line 4. int i = partition(a, l+1, r-1); quicksort(a, l, i-1); quicksort(a, i+1, r); } template <class Item> void hybridsort(Item a[], int l, int r) { quicksort(a, l, r); insertion(a, l, r); }
我对以上文字的问题,谁能用简单的例子解释一下
作者所说的“最坏的情况在任何实际排序中都不太可能发生。对于需要 N 平方时间的排序,所检查的三个元素中有两个必须是最大的”是什么意思?
作者所说的“它消除了对分区的哨兵键的需要”是什么意思?
在上面的程序中,我们在上面代码中注释的第 1、2、3 和 4 行实现了什么?
感谢您的时间和帮助!
【问题讨论】:
-
例如“它消除了对分区的哨兵键的需要”的哪一部分您不明白?不知道什么是分区?不知道什么是哨兵钥匙?不知道“消除”是什么意思?明白这句话,但不明白为什么它是真的?对于这三个问题,我认为您需要具体说明您所理解的内容。