void partition(int *a, int size) {
int pivot = a[0];
int left = 0, right = 0;
for(left = 1, right = size-1; left <= right; left++, right--) {
if(a[left] >= pivot && a[right] <= pivot){
swap(left, right, a);
}
}
swap(0, right, a);
}
为了应用快速排序,我编写了这个方法来分区数组作为初步步骤,我在这个样本数据上进行了测试:
8 2 5 13 4 19 12 6 3 11 10 7 9
正确的输出应该是:
6 2 5 7 4 3 8 12 19 11 10 13 9
但实际输出是:
6 2 5 13 4 3 8 12 19 11 10 7 9
算法必须将13
与7
交换,但由于上述循环中的&&
条件而失败。我想仅在left
时增加a[left] >= pivot
,仅在right
时减少a[right]<= pivot
。
答案 0 :(得分:2)
你或多或少地回答了你自己的问题。你可能想做这样的事情:
void partition(int *a, int size) {
int pivot = a[0];
int left, right;
for(left = 1, right = size-1; left < right; )
{
if(a[left] > pivot && a[right] <= pivot)
{
swap(left, right, a);
}
if(a[left] <= pivot) left++;
if(a[right] > pivot) right--;
}
}
答案 1 :(得分:2)
这是另一个选项,与原始选项稍微相似
int partition(int arr[], int left, int right)
{
int pivot = arr[left];
while (left != right)
{
if (arr[left] > arr[right])
{
swap(arr[left], arr[right]);
}
if (pivot == arr[left])
right--;
else // Pivot == arr[right]
left++;
}
return left;
}