Algorithm 使用三个robert sedwick中值的快速排序改进
下面是Robert Sedwick的算法书中快速排序部分的文本 通过从阵列的左侧、中部和右侧选择三个元素,我们可以将哨兵合并到该方案中。排序三个元素,然后在中间用“代码> A[R-1 ] < /代码>交换一个元素,然后在<代码> A[L+2],…,[R2] < /代码>上运行分区算法。这种改进称为三取一法 “三个中位数”方法有助于从三个方面快速排序Algorithm 使用三个robert sedwick中值的快速排序改进,algorithm,quicksort,Algorithm,Quicksort,下面是Robert Sedwick的算法书中快速排序部分的文本 通过从阵列的左侧、中部和右侧选择三个元素,我们可以将哨兵合并到该方案中。排序三个元素,然后在中间用“代码> A[R-1 ] < /代码>交换一个元素,然后在 A[L+2],…,[R2] < /代码>上运行分区算法。这种改进称为三取一法 “三个中位数”方法有助于从三个方面快速排序 这使得最坏的情况在任何实际情况下都不太可能发生。要使排序花费O(N^2)时间,所检查的三个元素中的两个必须位于文件中最大或最小的元素中,并且此事件必须在大多
O(N^2)
时间,所检查的三个元素中的两个必须位于文件中最大或最小的元素中,并且此事件必须在大多数分区中持续发生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); }
模板
无效exch(项目A、项目B)
{项目t=A;A=B;B=t;}
模板
作废合同(项目A、项目B)
{如果(B如果(r-l快速排序算法的优点是将数据分成两半,然后对每一半进行排序并合并结果。这种行为使其成为O(N log N)复杂性。然而,这是基于这样一个事实:当你将数据一分为二时,实际上是将数据一分为二。然而,这并不总是正确的。你不仅仅是将数组分割成两部分,而是将每个元素与分区元素进行比较(比如P)。如果一个元素小于或等于P,则它将进入左边的子数组,否则将进入右边的子数组。因此子数组的大小在很大程度上取决于分区元素。如果P等于数组中的最大或最小值,则其中一个子数组将为空,快速排序将不会从中获益“分阶段”。如果每次都继续,则算法的运行时间变为O(N^2)
“三个中位数”方法通过使分区元素成为三个选定元素的中间值元素来防止它成为数组中最大或最小的元素
代码中的四行有效地对三个元素进行了适当排序,并选择中间的一个作为新分区。如果要比较三个元素以确定中间值,您最好同时对它们进行排序。例如,“它消除了分区时对sentinel键的需要。”“你不明白吗?不知道分区是什么?不知道sentinel键是什么?不知道“消除”是什么意思?理解这个句子但不明白为什么它是真的?对于所有三个问题,我认为你需要指定你理解的内容。