快速排序请参考上一篇博文
为什么需要随机化?
我们在讨论快速排序平均性能时,前提假设是:输入数据的所有排练都是等概率的,但在实际工程中这种情况不总是成立的,所以引入随机化,随机选取一个元素作为主元,因为主元是随机选取的,我们期望在平均情况对输入数组的划分是比较均衡的
伪代码
c++代码
#include <iostream>
using namespace std;
//与快速排序一样
int partition(int array[],int p,int r)
{
int x=array[r];
int i=p-1;
for(int j=p;j<r;++j)
{
if(array[j]<=x)
{
++i;
swap(array[j],array[i]);//c++自带交换函数
}
}
swap(array[r],array[i+1]);
return i+1;
}
int partitionRandom(int array[],int p,int r)
{
int randNum=p+rand()%(r-p);//随机选取一个元素作为主元
swap(array[randNum],array[p]);
return partition(array,p,r);
}
void quickSortRandom(int array[],int p,int r)
{
if(p<r)
{
int q=partitionRandom(array,p,r);
quickSortRandom(array,p,q-1);//递归
quickSortRandom(array,q+1,r);
}
}
int main()
{
int Array[8]={2,8,7,1,3,5,6,4};
cout<<"原始数组顺序为:"<<endl;
for(int i=0;i<8;++i)
cout<<Array[i]<<" ";
quickSortRandom(Array,0,7);
cout<<endl<<"经过快速排序随机化后数组顺序为:"<<endl;
for(int i=0;i<8;++i)
cout<<Array[i]<<" ";
return 0;
}
运行结果