之前写过快速排序的代码,但是快速排序对已经排好序的数组再进行排序的话,就会遇到最差的情况,算法的复杂的也会达到n^2级别,所以对快速排序进行相应的优化,每次都随机的选择主元进行排序,这样能够最大的避免最差情况的发生,对于数据比较大的情况,程序运行的时间也有相应的提高,下面附上随机化快排的相应的代码(附有注释)。
#include<bits/stdc++.h>
using namespace std;
int n,a[1000001];
void qsort(int a[],int l,int r)
{
int m=a[l+rand()%(r-l)+1];//随机的选择一个数作为主元
int i=l,j=r,t;
while(i<=j)
{
while(a[i]<m) i++;
while(a[j]>m) j--;
if(i<=j)
t=a[i],a[i]=a[j],a[j]=t,i++,j--;
}
if(l<j)
qsort(a,l,j);//递归调用对左边的数组在进行快排
if(r>i)
qsort(a,i,r);////递归调用对右边的数组在进行快排
}
int main()
{
cin>>n;
srand((unsigned)time(NULL));//随机数种子
for(int i=1;i<=n;i++)
a[i]=rand()%(n*10)+1,cout<<a[i]<<" "; // 随机的给数组a赋初值
cout<<endl;
qsort(a,1,n);//调用自己写的随机化快排
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
}