以两种方式实现快速排序算法,但只接受一种?

时间:2015-08-13 14:44:47

标签: c algorithm sorting quicksort

我已经以两种方式实现了快速排序算法。

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。虽然存在细微差别,但我无法找到导致性能差距的问题,有人可以找到然后解释一下吗?

1 个答案:

答案 0 :(得分:3)

你的第一个是Hoare分区方案,而第二个是Lomuto分区方案。根据多个消息来源,Lomuto的变体不应该在实践中使用,它的唯一优势是教学,因为它更容易理解。

一些此类来源:

  1. https://en.wikipedia.org/wiki/Quicksort

      

    Hoare方案比Lomuto的分区方案更有效,因为它平均平均 <三倍>并且即使所有值都相等也会创建有效的分区。

  2. https://cs.stackexchange.com/questions/11458/quicksort-partitioning-hoare-vs-lomuto

      

    Lomuto的方法简单易行,但不应用于实现库排序方法