这个快速排序有什么问题?

时间:2014-02-28 17:44:42

标签: c algorithm recursion quicksort

快速排序。代码是用纯粹的C.写的。这个algo实现有什么问题?

void quick_sort(void *base, size_t num, size_t size, int (*comp)(const void*, const void*)) {
    unsigned int i = 0, j = num-1;
    int rpos = rand() % num;
    do {
        while(comp((char*)base + size*i, (char*)base + rpos*size) < 0) i++;
        while(comp((char*)base + size*j, (char*)base + rpos*size) > 0) j--;
        if (i <= j) swap((char*)base + size*i++, (char*)base + size*j--, size);
    } while (i <= j);
    if (i < num) quick_sort((char*)base, j, size, comp);
    if (j > 0) quick_sort((char*)base + size*i, num - i, size, comp);
}

它属于无限递归。

2 个答案:

答案 0 :(得分:1)

应该有if(i <= j)交换并且做。 。 。而(i <= j)不仅仅是(i

http://www.algolist.net/Algorithms/Sorting/Quicksort示例代码非常容易理解:)

答案 1 :(得分:1)

如果没有别的,看起来你有一些一分一秒的错误。

如果num应该是要排序的元素数,那么数组索引应该从0num-1。从j = num开始并比较base + size*j处的值,您就会一直走出阵列边界。

另外,在进行扫描之前,尝试将您的pivot元素交换到排序区域的开头或结尾;这样可以防止它被踩到......