我已经编写了这种快速排序算法,但是由于某种原因它不能正常工作,我需要一些帮助来找出错误。
我尝试不使用内置交换功能,但无法正常工作。
FindPivot函数在交换它们后返回数组的三个元素(开始,一半,结束)的中值,以便最小的元素在开始处,最大的在中间,中值在数组的末尾>
#include <bits/stdc++.h>
using namespace std;
int pivotIdx, pivot, n;
int partitn(int* arr, int first, int last)
{
pivot = FindPivot(arr,first,last-1);
// pivot = arr[last-1];
cout << "Pivot: " << pivot << endl;
int L = first;
int R = last-2;
while(L<R)
{
while(arr[L]<=pivot)
L++;
while(arr[R]>=pivot)
R--;
swap(arr[L++],arr[R--]);
}
swap(arr[L],arr[last-1]);
return L;
}
void QuickSort(int* arr,int first,int last)
{
if(last-first < 6){
InsertionSort(arr,first,last);
}else{
pivotIdx = partitn(arr, first, last);
QuickSort(arr, first, pivotIdx);
QuickSort(arr, pivotIdx+1, last);
}
}
int main()
{
cin >> n;
int arr[100];
for(int i=0;i<n;i++)
cin>>arr[i];
QuickSort(arr,0,n);
for(int i=0;i<n;i++){
cout << arr[i] << " ";
}
return 0;
}
8
5 1 6 2 7 3 8 4
数据透视:4
1 2 3 5 4 6 7 8
答案 0 :(得分:1)
可能还有其他问题,但是当前的分区代码可能会扫描超过子数组的边界。假设枢轴不在子数组的任何一端,则代码可以用<代替<=和>代替> =,并且扫描不会超出边界。
while(arr[L]<pivot) // not <=
L++;
while(arr[R]>pivot) // not >=
R--;
答案 1 :(得分:-1)
输入:
5 1 6 2 7 3 8 4
它变成:
QuickSort([5 1 6 2 7 3 8 4], 0, 8)
partitn([5 1 6 2 7 3 8 4], 0, 8)
pivot = 4
L = 0 R = 6 [5 1 6 2 7 3 8 4]
// Enter Loop
L = 0 R = 5 swap [3 1 6 2 7 5 8 4]
L = 2 R = 3 swap [3 1 2 6 7 5 8 4]
L = 3 R = 2 swap [3 1 6 2 7 5 8 4]
// Exit Loop
L = 3 swap [3 1 6 4 7 5 8 2] This looks wrong.
The 2 and 6 are in the wrong place.