int partition(int A[], int low, int high){
int mid = (low+high)/2;
int pivot = A[mid];
while(low < high) {
while(low <= high && A[high] >= pivot)
high--;
while (low <= high && A[low] <= pivot)
low ++;
if(low < high){
int tmp = A[low];
A[low] = A[high];
A[high] = tmp;
high--;
low++;
}
}
return mid;
}
这是我的快速排序分区函数,它假设交换数组的索引,以便枢轴左侧的所有内容都较低,而右侧的值较高。然后它返回轴心点。
我的问题是这个函数有什么问题,它编译得很好,但我找不到逻辑错误。
void quickSort(int A[], int low, int high) {
if (low >= high){
return;
}
int ppos = partition(A, low, high);//does the swaping and returns the pivot
quickSort(A, low, ppos-1);
quickSort(A, ppos+1, high);
}
这是我如何回忆起这个功能,无法判断分区中的错误还是回想起分区。
答案 0 :(得分:1)
您返回枢轴的中间位置,但在分区后,它可能已被移动到其他位置。
通常的解决方法是将枢轴移到前面,进行分区并最终将枢轴放到正确的位置。
答案 1 :(得分:0)
以@ CommuSoft为例
20 6 15 3 8
在第一步中,20
和8
将被交换,提供
8 6 15 3 20
low=1
和high=3
。
在下一步中,high
停留在3
,low
也会升至3
。由于low == high
不会交换任何内容,因此您的值会低于上限范围内的pivot
。
修复此比较
while (low <= high && A[high] > pivot)
high--;
while (low <= high && A[low] < pivot)
low++;
这样也可以移动枢轴并避免半分区范围。
留下最后一个问题,返回mid
作为分区点。由于枢轴值也可能会移动,因此必须返回实际分区点,即low
return low;