快速排序。代码是用纯粹的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);
}
它属于无限递归。
答案 0 :(得分:1)
应该有if(i <= j)交换并且做。 。 。而(i <= j)不仅仅是(i http://www.algolist.net/Algorithms/Sorting/Quicksort示例代码非常容易理解:)
答案 1 :(得分:1)
如果没有别的,看起来你有一些一分一秒的错误。
如果num
应该是要排序的元素数,那么数组索引应该从0
到num-1
。从j = num
开始并比较base + size*j
处的值,您就会一直走出阵列边界。
另外,在进行扫描之前,尝试将您的pivot元素交换到排序区域的开头或结尾;这样可以防止它被踩到......