【问题标题】:Segmentation in QuickSort快速排序中的分割
【发布时间】:2018-02-24 15:41:38
【问题描述】:

我在尝试运行此 QuickSort 时遇到分段错误:11,但它编译得很好。我使用驱动程序运行它,这就是我使用 quicksort() 和 quicksortR() 的原因。造成分割的原因是什么?

/*  -------- Quick sort stuff starts here --------- */
int partition(int array[], int start, int stop) {
    int compars = 0;
    int pivot = array[stop];
    int i = start - 1;
    for (int j = start; j <= stop - 1; j++) {
        if (array[j] <= pivot) {
            i++;
            int temp = array[j];//swaps values of i and j
            array[j] = array[i];
            array[i] = temp;
        }
        compars++;
    }
    int temp = array[i + 1];
    array[i + 1] = array[stop];
    array[stop] = temp;
    return compars;
}

int quickSortR(int array[], int start, int stop) {
    int compars = 0;
    int mid = array[stop];
    if (start < stop) {
        compars = compars + partition(array, start, stop);
        quickSortR(array, start, mid - 1);
        quickSortR(array, mid+1, stop);
    }
    return compars;
}

int quickSort(int array[], int n) {
    return quickSortR(array, 0, n);
}

/*  ----------- end quick sort stuff ----------------- */

【问题讨论】:

  • 我建议您花点时间阅读 Eric Lippert 的 How to debug small programs,并了解如何使用 调试器 来捕获 lite 的崩溃。
  • int quickSort(int array[], int n)。这里的n 是什么?如果array 中的元素数量,那么您在int mid = array[stop]; 处超出范围
  • 是的,n是数组的大小。
  • int mid = array[stop];.. 我认为mid不能像quickSortR(array, start, mid-1);那样使用
  • '我遇到分段错误:11 当我尝试运行此 QuickSort 时,但它编译得很好' - 这是只开发了一半的软件的正常行为,即。编写和构建但未经测试和调试。

标签: c algorithm segmentation-fault quicksort


【解决方案1】:

我在尝试运行此 QuickSort 时遇到分段错误:11,但它编译得很好

请注意:程序编译意味着编译器了解您希望程序执行的操作。编译器绝不会检查您的程序所做的事情是否有意义。 如果它知道你想做什么,为什么不自己编写程序呢?

【讨论】:

    【解决方案2】:

    您调用quicksort 并将数组元素的数量作为stop 参数,但您将枢轴初始化为int pivot = array[stop];。您正在阅读数组的末尾。未定义的行为。

    代码中可能还有其他问题,但仅此一项就可以解释崩溃。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-13
      • 2013-12-08
      相关资源
      最近更新 更多