c - 快速排序的 C 实现在 arr[0] 处产生垃圾值
问题描述
考虑以下算法:
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;
}
修复段错误后,我注意到该算法总是在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()
. 可能在数组的开头或结尾使用垃圾(未初始化)元素调用它。7
这也可能解释了为什么输出中缺少最大值。
如果我进一步推测,我猜想在 Java 中,数组被初始化为零,所以你在输出中得到一个额外的零(也许你在其他零中忽略了?)
编辑:初始函数是这样调用的:
qsort(arr, 0, 9);
其中 9 是数组的长度 - 1。
对于您的示例,这9
显然不正确,因此这是一个错误。它将解释垃圾元素,但不考虑丢失的元素。
我的下一个假设是,对一个十元素数组(9 个实数 + 1 个垃圾)进行排序后,您只打印出前九个元素。这将解释7
您的输出中的缺失(它是最大的,因此被放置在最终位置,即没有被打印出来的位置)。
PS 如果我可以为未来的问题提供一些不请自来的建议,发布一个最小的、完整的和可验证的示例将使所有这些猜测调试完全没有必要,因为我们可以立即看到你的代码到底发生了什么. :)
推荐阅读
- python - 存储相关矩阵的上/下半部分
- android - NotifyItemRemoved 使用 firebaserecycleradapter 无法正常工作?
- javascript - 反应路由器投掷
外面 错误 - javascript - 获取最后一个子元素之前的内部文本
- jmeter - Jmeter 线程没有减速
- react-native - 如何在本机反应中分离2个图像
- go - jfrog 带参数的 go 命令
- amazon-web-services - 如何获取 EC2 实例的实例名称、cpu 数量、内核和操作系统信息
- android - 如何在 Espresso Android 中为每个单独的测试用例重新启动应用程序
- postgresql - postgresql:根据两个不同时间戳列与 create_time 的计数创建图形