这个快速排序程序有什么问题?
我是编码的初学者,这是我的快速排序的 C 程序。不过似乎有些错误,因为对于数组{6,76,32,18,9,90,43,45,3,1},输出结果为{1,3,6,9,18,32,45,43,76,90}. 不知道为什么45要来43?
#include <stdio.h>
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int partition(int list[], int l, int r) {
int pi = l;
int too_big = l + 1;
int too_small = r;
while (too_big < too_small) {
while (list[too_big] <= list[pi] && too_big < r)
too_big++;
while (list[too_small] > list[pi] && too_small > l)
too_small--;
if (too_big < too_small)
swap(&list[too_big], &list[too_small]);
}
swap(&list[pi], &list[too_small]);
return too_small;
}
void qsort(int list[], int l, int r) {
if (l < r) {
int pi = partition(list, l, r);
qsort(list, l, pi - 1);
qsort(list, pi + 1, r);
}
}
回答
您可以通过在从 返回之前打印分区数组来调试您的函数partition。对于您的示例,您将获得:
3 1 6 18 9 90 43 45 32 76
^^
1 3 . . . . . . . .
^^
. . . 9 18 90 43 45 32 76
^^
. . . . . 76 43 45 32 90
^^
. . . . . 32 43 45 76 .
^^
. . . . . 32 43 45 . .
^^
. . . . . . 45 43 . .
^^
(^^标记枢轴。)您会看到它45并被43交换,但它们不应该,因为它们已经按顺序排列。
当您在最后无条件地将枢轴交换到位以及对包含两个元素的数组进行分区时,就会发生错误交换。在这种情况下,不会进入主循环,并且您可能too_small坐在不属于左分区的元素上。
交换前检查交换是否干扰分区。