1、未优化的快速排序
快速排序的基本思想是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
2、随机标记元素后的快速排序
未随机化处理的快速排序最坏情况发生在划分过程产生的两个区域分别包含n-1个元素和1个元素的时候。由于函数Partition的计算时间为O(n),所以如果算法Partition的每一步都出现这种不对称划分,则T(n)=O(n^2)。
在最好情况下,每次划分所取的基准都恰好为中值,即每次划分都产生两个大小为n/2的区域。此时T(n)=O(nlogn)。
因此,快速排序算法的性能取决于划分的对称性。修改Partition,可以设计出采用随机选择策略的快速排序算法。在快速排序算法的每一步中,当数组还没有被划分时,可以在a[p:r]中随机选择一个元素作为划分基准。
#include <iostream>
#include <stdio.h>
#include <cstdlib>
#include <ctime>
using namespace std;
void Swap(int &x,int &y)
{
int temp = x;
x = y;
y = temp;
}
inline int Random(int x, int y)
{
srand((unsigned)time(0));
int ran_num = rand() % (y - x) + x;
return ran_num;
}
int Partition(int r[],int s,int t)
{
int x=r[s];//选r[s]为基准
int i=s,j=t;
while(i<j)
{
while(i<j&&r[j]>=x) j--;
if(i<j) r[i]=r[j];
while(i<j&&r[i]<=x) i++;
if(i<j) r[j]=r[i];
}
r[i]=x;//基准放到正确位置
for(int i=s;i<=t;i++) cout<<r[i]<<' ';
cout<<endl;
return i;//基准位置
}
int RandomizedPartion(int a[],int s,int t)
{
int i=Random(s,t);
Swap(a[i],a[s]);
return Partition(a,s,t);
}
void RandomizedQuickSort(int r[],int first,int end)
{
if(first<end)
{
int pivot=RandomizedPartion(r,first,end);
RandomizedQuickSort(r,first,pivot-1);
RandomizedQuickSort(r,pivot+1,end);
}
}
int main()
{
int input[]={49,38,65,97,76,13,27,49};
int length=sizeof(input)/sizeof(int);
cout<<"原数组:"<<endl;
for(int i=0;i<length;i++)
{
cout<<input[i]<<' ';
}
cout<<endl<<"排序过程:"<<endl;
RandomizedQuickSort(input,0,length-1);
return 0;
}