【问题标题】:What's wrong with this quicksort? [closed]这个快速排序有什么问题? [关闭]
【发布时间】: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等于numj等于-1之前停止。如果i == j,则可能不需要与自身交换一行。
  • StackOverflow 不是用于调试错误代码的服务。你可以自己调试:找到一个失败的案例。在纸上写下你认为这个程序应该为这种情况做的一切。现在单步执行调试器中的程序。当它执行不在您列表中的操作时,这就是错误。

标签: c algorithm recursion quicksort


【解决方案1】:

应该有 if(i

http://www.algolist.net/Algorithms/Sorting/Quicksort 的示例代码真的很容易理解:)

【讨论】:

  • 我不确定为什么需要在 i 和 j 相等时进行交换,但看起来循环终止为时过早并且需要 while ((i
  • if(i&lt;=j) swap 没有意义 - 它只是将中间元素与自身交换。
  • 你仍然需要它来增加 i 和减少 j 或者它仍然可能无限循环。
  • 不管怎样还是不行。
【解决方案2】:

如果没有其他问题,您似乎遇到了一些错误。

如果num 应该是要排序的元素数,那么数组索引应该从0num-1。从j = num 开始并比较base + size*j 的值,您始终在超出数组界限。

另外,在进行扫描之前,尝试将枢轴元素交换到排序区域的开头或结尾;这样就不会被踩到了……

【讨论】:

  • 是的,这是一个错误,但修复后它也会崩溃
猜你喜欢
  • 2021-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多