以下来自 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 行实现了什么?
感谢您的时间和帮助!