快速排序运行时速度问题

时间:2013-04-11 22:13:10

标签: c performance algorithm sorting quicksort

我有些困扰我的事情。我有一个快速排序算法的实现,但是当我在一个包含超过30个元素的整数数组上测试它时,在我看来排序需要很长时间。有时甚至超过10秒,与选择排序,插入排序和冒泡排序不同,它在10000个元素上比在100个元素上快速排序更快。

这是我的解决方案,请给出建议:)

void kvikSort(int a[], int l, int d) {
    int i, k;

    if (l >= d)
        return;

    k = l;
    swap(&a[l], &a[(l + d) / 2]);

    for (i = l + 1; i <= d; i++)
        if (a[i] < a[l])
            swap(&a[++k], &a[i]);
    swap(&a[l], &a[k]);

    kvikSort(a, 0, k-1);
    kvikSort(a, k+1, d);

}

编辑:我在Linux Mint 14上使用GCC v 4.7.2,proc:intel core2duo e7400

编辑:我的其他算法:

void selectionSort(int a[], int n) {
    int i, j, min;

    for (i = 0; i < n - 1; i++) {
        min = i;
        for (j = i + 1; j < n; j++)
            if (a[j] < a[min])
                min = j;
        if (min != i)
            swap(&a[min], &a[i]);
    }
}


void insertionSort(int a[], int n) {
    int i, j;

    for (i = 0; i < n - 1; i++)
        for (j = i + 1; j > 0 && a[j] < a[j-1]; j--)
            swap(&a[j], &a[j-1]);
}


void bubbleSort(int a[], int n) {
    int i, j;

    for (i = n - 1; i > 0; i--)
        for (j = 0; j < i; j++)
            if (a[j] > a[j+1])
                swap(&a[j], &a[j+1]);
}


void swap(int *i, int *j) {
    int tmp;

    tmp = *i;
    *i = *j;
    *j = tmp;
}

编辑:也许我应该提一下,在我的测试程序中,我首先将随机生成的数组输出到文本文件,然后将数组排序到另一个文本文件。所以它肯定运行缓慢,但问题不在于,问题在于快速排序比其他排序慢得多。

2 个答案:

答案 0 :(得分:4)

您的第一次递归电话

kvikSort(a, 0, k-1);

有错误的下限,应该是

kvikSort(a, l, k-1);

如果下限为0,则会一次又一次地重新排序数组的初始部分。

答案 1 :(得分:1)

问题在于:

void kvikSort(int a[], int l, int d) {
int i, k;

if (l >= d)
    return;

k = l;
swap(&a[l], &a[(l + d) / 2]);

for (i = l + 1; i <= d; i++)
    if (a[i] < a[l])
        swap(&a[++k], &a[i]);
swap(&a[l], &a[k]);

>>> kvikSort(a, 0, k-1);
kvikSort(a, l, k-1);
kvikSort(a, k+1, d);