我一直在研究这个快速排序代码已经有一段时间了,并且无法弄清楚为什么我会根据我获得数组值的位置得到不同的结果。如果我在循环之外获得了pivot的值,它可以正常工作,在循环内部它没有。
我已经突出显示了每个函数与某些函数之间的区别/ *这个函数/不是* / comments。
#include <stdio.h>
void quicksort(int * x, int left_limit, int right_limit) {
int left = left_limit;
int right = right_limit;
int pivot = x[(right + left) / 2]; /* This works */
while (left <= right) {
while (x[left] < pivot) { left++; } /* This works */
while (x[right] > pivot){ right--; } /* This works */
if (left <= right) {
int temp = x[left];
x[left] = x[right];
x[right] = temp;
left++;
right--;
}
}
if (left_limit < right)
quicksort(x, left_limit, right);
if (left < right_limit)
quicksort(x, left, right_limit);
}
void quicksortBROKEN(int * x, int left_limit, int right_limit) {
int left = left_limit;
int right = right_limit;
int pivot = (right + left) / 2; /* This doesnt */
while (left <= right) {
while (x[left] < x[pivot]) { left++; } /* This doesnt */
while (x[right] > x[pivot]){ right--; } /* This doesnt */
if (left <= right) {
int temp = x[left];
x[left] = x[right];
x[right] = temp;
left++;
right--;
}
}
if (left_limit < right)
quicksort(x, left_limit, right);
if (left < right_limit)
quicksort(x, left, right_limit);
}
int main() {
int x[] = {0,2,1,4,3,5,6,3,7,8,4,3,7,8};
quicksort(x, 0, 13);
for (int i = 0; i < 14; i++) {
printf("%d, ", x[i]);
}
printf("\n");
return 0;
}
破损的功能出了什么问题?
答案 0 :(得分:1)
在破碎的版本中,枢轴的值(而不是位置)会在功能过程中发生变化。
答案 1 :(得分:1)
调试器可能会向您展示最佳,但功能之间存在明显差异。
第一个从数组中获取值到变量并且不会更改它。
第二个采取位置并在每次修改数组时比较数组中该位置的值。如果在存储的位置上修改数组,则比较自然会有所不同。