考虑以下算法:

void qsort(int arr[], int left, int right) {
        if (left < right) {
        int index = partition(arr, left, right);
        qsort(arr, left, index - 1);
        qsort(arr, index + 1, right);
    }
}

int partition(int arr[], int left, int right) {
    int pivot = arr[right];
    int i = left - 1;
    for (int j = left; j < right; j++) {
        if (arr[j] <= pivot) {
            ++i;
            swap(&arr[i], &arr[j]);
        }
    }
    swap(&arr[i + 1], &arr[right]);
    return i + 1;
}

inline void swap(int* i, int* j) {
    int temp = *i;
    *i = *j;
    *j = temp;
}

在我修复了segfults之后,我注意到算法总是在arr[0]处产生一个垃圾值因此,如果输入数组是:5 5 1 3 7 0 0 0 3,则输出是-858993460 0 0 0 1 3 3 5 5我已经在一个调试器中运行了很多次,但是我仍然不知道垃圾值的来源。更有趣的是,在Java中,几乎相同的算法工作得很好。
编辑
初始函数的调用方式如下:qsort(arr, 0, 9);,其中9是数组-1的长度。

最佳答案

我怀疑您在初始化arr或调用qsort()时出现了一个off-by-one错误很可能是在数组的开头或结尾使用垃圾(未初始化)元素调用它这也可能解释了为什么输出中缺少最大值7
如果我进一步推测,我猜在Java中,数组gets initialized with zeros会在输出中得到一个额外的零(也许你忽略了其他的零?)
编辑:初始函数的调用方式如下:qsort(arr, 0, 9);,其中9是数组-1的长度。
对于您的示例,9显然不正确,因此这里有一个错误它将考虑垃圾元素,但不考虑缺少的元素。
我的下一个假设是,在对10个元素数组(9个实数+1个垃圾)排序之后,您只打印出前9个元素这将解释输出中缺少的7(它是最大的,所以放在最后一个位置,这个位置没有打印出来)。
另外,如果我可以为将来的问题提供一些非请求的建议,发布一个Minimal, Complete, and Verifiable example将使所有这些通过推测进行的调试完全没有必要,因为我们将能够立即看到您的代码到底是怎么回事:)

关于c - 快速排序的C实现在arr [0]处产生垃圾值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56071287/

10-09 08:56
查看更多