我已经以两种方式实现了快速排序算法。
quick_sort 功能相同:
void quick_sort(int *a, int left, int right) {
if (left < right) {
int mid = partition(a, left, right);
quick_sort(a, left, mid - 1);
quick_sort(a, mid + 1, right);
}
分区功能在两个实现中有所不同:
第一种方式基于&#34;算法&#34;罗伯特塞奇威克的书:
int random = rand() % (right - left + 1) + left;
exchange(&a[left], &a[random]);
int i = left;
int j = right + 1;
int pivot = a[left];
while (1) {
while (a[++i] < pivot)
if (i == right) break;
while (a[--j] > pivot)
if (j == left) break;
if (i >= j) break;
exchange(&a[i], &a[j]);
}
exchange(&a[left], &a[j]);
return j;
第二种方式基于&#34;算法简介&#34;这本书比第一种方式更容易理解:
int random = rand() % (right - left + 1) + left;
exchange(&a[right], &a[random]);
int pivot = a[right];
int j = left - 1;
int i;
for (i = left; i < right; i++) {
if (a[i] <= pivot) {
j++;
exchange(&a[j], &a[i]);
}
}
exchange(&a[j + 1], &a[right]);
return j + 1;
我已经在Online Judge Site上提交了两个实现:TSORT,但只接受了第一个实现,第二个是Time Limit Exceed。虽然存在细微差别,但我无法找到导致性能差距的问题,有人可以找到然后解释一下吗?
答案 0 :(得分:3)
你的第一个是Hoare分区方案,而第二个是Lomuto分区方案。根据多个消息来源,Lomuto的变体不应该在实践中使用,它的唯一优势是教学,因为它更容易理解。
一些此类来源:
https://en.wikipedia.org/wiki/Quicksort
Hoare方案比Lomuto的分区方案更有效,因为它平均平均 <三倍>并且即使所有值都相等也会创建有效的分区。
https://cs.stackexchange.com/questions/11458/quicksort-partitioning-hoare-vs-lomuto
Lomuto的方法简单易行,但不应用于实现库排序方法。