在上一篇文章中,我写了快速排序的实现,不过快速排序的运行时间依赖于划分是否平衡,而平衡与否又依赖于用于划分的元素。如果划分是平衡的,那么快速排序算法的性能与归并排序一样,都为O(nlgn),如果划分是不平衡的那么快速排序的性能就接近插入排序。为了使快速排序的平均运行性能达到最优,采用随机抽样。与我在上一篇文章中始终用A[r]作为主元不同,这次我从 A[p,r]中随机的选择一个元素作为主元 。因为主元是从输入数组中随机选取的,所以在平均情况下,对输入数组的划分是比较均衡的。这样,期望的运行时间将达到O(nlgn)
// randomized-quicksort.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "iostream"
using namespace std;
void randomizedQuickSort(int* ,int ,int);
int randomizedPartition(int*,int,int);
int partition(int*,int,int);
void swap(int&,int&);
int _tmain(int argc, _TCHAR* argv[])
{
int A[10]={4,5,6,45,8,45,67,34,68,87};
int p=0;
int r=9;
randomizedQuickSort(A,p,r);
for(int i=0;i<=r;i++)
cout<<A[i]<<",";
cout<<endl;
return 0;
}
void randomizedQuickSort(int* A,int p,int r)
{
int q=0;
if(p<r)
{
q=randomizedPartition(A,p,r);
randomizedQuickSort(A,p,q-1);
randomizedQuickSort(A,q+1,r);
}
}
int randomizedPartition(int* A,int p,int r)
{
int i=rand()%(r-p+1)+p;
swap(A[i],A[r]);
return partition(A,p,r);
}
int partition(int* A,int p,int r)
{
int x=A[r];
int i=p-1;
for(int j=p;j<r;j++)
{
if(A[j]<x)
{
i++;
swap(A[j],A[i]);
}
}
swap(A[r],A[i+1]);
return i+1;
}
void swap(int& a,int& b)
{
int temp=a;
a=b;
b=temp;
}