【问题标题】:My QuickSort code sometimes run but sometimes it does not and I don't know where error got happened [closed]我的 QuickSort 代码有时会运行,但有时不会,而且我不知道错误发生在哪里[关闭]
【发布时间】:2017-05-10 09:20:56
【问题描述】:
int partition(int list[], int left, int right) {
    int low = left + 1;
    int high = right;
    int pivot = list[left];

    while (low < high) {
        while (low <= right && list[low] < pivot) {
            low++;
        }
        while (high >= left && list[high] > pivot) {
            high--;
        }
        if (low < high) Swap(&list[low], &list[high]);
    }
    Swap(&list[high], &list[left]);
    return high;
}

void quicksort(int list[], int left, int right) {
    if (left <= right) {
        int p = partition(list, left, right);
        quicksort(list, left, p - 1);
        quicksort(list, p + 1, right);
    }
}

此代码有时会成功排序,但有时它不会产生任何后果并且无法停止运行。我应该修复哪个部分?

【问题讨论】:

  • 我建议您在每个循环中使用断点来检查正在发生的事情。此外,在发布到 Stack Overflow 时,导致错误的示例输入总是有帮助的。
  • srand((int)time(NULL)); 将其移至main,以便在您的程序中调用一次。否则,如果代码运行时间不到一秒钟,您可能会在每次调用时得到相同的rand() 号码。另请注意,srand 采用 unsigned int 参数,而不是 int
  • 当发布一个关于运行时问题的问题时(因为这个问题)发布示例输入、预期输出、实际输出和发布的干净编译的代码(发布的代码缺少 main() 函数和所需的#include 语句)
  • 发布的代码似乎试图在 partition() 函数中执行 compare() 函数,这:1)使函数不必要地复杂,2)包含代码问题的根源.除此之外,这行:Swap(&amp;list[high], &amp;list[left]); 不正确,因为没有任何迹象表明需要交换。
  • 感谢您的评论

标签: c algorithm data-structures quicksort


【解决方案1】:

问题是当函数分区遇到一个只有两个元素的数组时。在这种情况下,如果第一个元素小于第二个元素,则最后一次交换调用将对数组进行洗牌。

您需要检查交换是否合理:

if( list[high] < list[left] )
{
    Swap( &list[high] , &list[left] );
}

您还需要在最内层循环中交换变量 low 和 high 后递增和递减变量:

if (low < high) 
{
    Swap(&list[low], &list[high]);
    low++;
    high--;
}

high 应该在 left+1 处停止,而不是在此处的左侧:

 while (high >= left &&

【讨论】:

    【解决方案2】:

    你的partition() 有缺陷

        while (low < high) {
            while (low <= right && list[low] < pivot) {
                low++;
            }
            while (high >= left && list[high] > pivot) {
                high--;
            }
            if (low < high) Swap(&list[low], &list[high]);
        }
    

    如果list[low]list[high]pivot 具有相同的值,这将生成一个无限循环。

    【讨论】:

      猜你喜欢
      • 2015-07-13
      • 1970-01-01
      • 1970-01-01
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-14
      • 1970-01-01
      相关资源
      最近更新 更多