#include<bits/stdc++.h>
using namespace std;
int Partition(int a[],int l,int r) //原版
{
int k=a[l];
while(l<r)
{
while(l<r&&a[r]>=k)r--;
a[l]=a[r];
while(l<r&&a[l]<=k)l++;
a[r]=a[l];
}
a[l]=k;
return l;
}
int Partition2(int a[],int l,int r)//改进版,即取l、mid、r对应值中的中间值作为数轴元素
{
int mid=(l+r)/2;
int k1=a[l],k2=a[mid],k3=a[r];
int k;
if(k1>=min(k2,k3)&&k1<=max(k2,k3))
{
k=k1;
}
else if(k3>=min(k2,k1)&&k3<=max(k2,k1))
{
k=k3;
while(l<r&&a[l]<=k)l++;
a[r]=a[l];
}
else
{
k=k2;
while(l<r&&a[l]<=k)l++;
a[mid]=a[l];
}
while(l<r)
{
while(l<r&&a[r]>=k)r--;
a[l]=a[r];
while(l<r&&a[l]<=k)l++;
a[r]=a[l];
}
a[l]=k;
return l;
}
void QuickSort(int a[],int l,int r)
{
if(l>=r)return;
int p=Partition2(a,l,r);
QuickSort(a,l,p-1);
QuickSort(a,p+1,r);
}
int main()
{
int a[]={5,3,4,1,2};
QuickSort(a,0,4);
for(int i=0;i<5;++i)
cout<<a[i]<<" ";
}
快速排序及改进
最新推荐文章于 2021-04-20 09:10:36 发布