【发布时间】:2014-02-28 17:44:41
【问题描述】:
快速排序。代码是用纯 C 编写的。这个算法实现有什么问题?
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);
}
陷入无限递归。
【问题讨论】:
-
你不能在纯 C 中对
void *进行指针运算;您只能在 GNU C 中这样做。严格来说,您应该在向其添加偏移量之前将base转换为char *或附近。此外,您正在使用j = num越界访问...数组的最后一个元素(或多或少)是base[num-1]。 -
好的,但这并不能解决这个问题。
-
这个问题似乎跑题了,因为它太本地化了。
-
你的while循环需要在
i等于num或j等于-1之前停止。如果i == j,则可能不需要与自身交换一行。 -
StackOverflow 不是用于调试错误代码的服务。你可以自己调试:找到一个失败的案例。在纸上写下你认为这个程序应该为这种情况做的一切。现在单步执行调试器中的程序。当它执行不在您列表中的操作时,这就是错误。
标签: c algorithm recursion quicksort