我没有得到实施快速排序算法的错误。 以下是代码:
#include <bits/stdc++.h>
using namespace std;
int part(vector<int> &arr,int i,int j)
{
int pivot=i;
i++;
while(i<j)
{
while(arr[i]<arr[pivot])
i++;
while(arr[j]>arr[pivot])
j--;
if(i<j)
swap(arr[i],arr[j]);
}
swap(arr[j],arr[pivot]);
return j;
}
void quickSort(vector <int> &arr,int p,int r) {
if(p<r)
{
int t=part(arr,p,r);
quickSort(arr,p,t-1);
quickSort(arr,t+1,r);
}
}
int main()
{
int n;
cin >> n;
vector <int> arr(n);
for(int i = 0; i < (int)n; ++i) {
cin >> arr[i];
}
quickSort(arr,0,arr.size()-1);
for(int i=0;i<arr.size();i++)
cout<<arr[i]<<" ";
cout<<endl;
return 0;
}
我正在给予输入 7 5 8 1 3 7 9 2
但输出为: 2 1 3 7 5 8 9
任何人都可以指出我哪里出错了。
答案 0 :(得分:0)
如果我没弄错,
中的条件if(i<j)
swap(arr[i],arr[j]);
函数part
中的不正确;它应该检查数组值arr[i]
和arr[j]
的关系,而不是i
和j
,以决定是否要交换数组条目。
答案 1 :(得分:0)
在&#34;部分&#34;即使值已经到位,您也可以在最后进行交换。 只需在交换前检查值:
int part(vector<int> &arr, int i, int j)
{
int pivot = i;
i++;
while (i < j)
{
while (arr[i] < arr[pivot])
i++;
while (arr[j] > arr[pivot])
j--;
if (i < j)
swap(arr[i], arr[j]);
}
if (arr[j] < arr[pivot]) {
swap(arr[j], arr[pivot]);
}
return j;
}