快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
(https://img-blog.csdn.net/20160608122859542)
普通快速排序
void quickSort(int A[], int p, int r)
{
if (p< r)
{
int i = p, j = r, x = A[p];
while (i < j)
{
while(i < j && A[j]>= x)
j--;
if(i < j)
A[i++] = A[j];
while(i < j && A[i]< x)
i++;
if(i < j)
A[j--] = A[i];
}
A[i] = x;
quickSort(A, p, i - 1);
quickSort(A, i + 1, r);
}
}
随机快排
主元元素是随机选择的,我们可以期望在平均情况下对输入数组的划分是比较均衡的。
通过头文件stdlib.h中的rand()方法生成[p, r]之间的随机数作为主元。rand() % n 将生成 [0, n)之间的随机数。
为了重用quickSort方法,将选定的主元交换到位置 p。
随机化快速排序的好处:
其运行时间不依赖与输入序列的顺序
无需对输入序列的分布做任何假设
没有 一种特别的输入会引起最差的运行情况
最差的情况由随机数产生器决定
void randomizedquickSort(int A[],int p,int r)
{
int i=rand()%(r-p+1)+p;
int x=A[p];
A[p]=A[i];
A[i]=x;
quickSort(A,p,r);
}
测试代码
#include<iostream>
#include<time.h>
#include<stdlib.h>
using namespace std;
void quickSort(int a[],int,int);
void randomizedquickSort(int a[],int,int);
int main()
{
clock_t start,finish;
double totaltime;
int array[100]={0};
for(int i=0;i<100;i++)
{
array[i]=rand()%100;
}
start=clock();
int k;
int len=sizeof(array)/sizeof(int);
cout<<"原始数组序列为:"<<endl;
for(k=0;k<len;k++)
cout<<array[k]<<",";
cout<<endl;
quickSort(array,0,len-1);
//randomizedquickSort(array,0,len-1);
cout<<"排序后的数组序列为:"<<endl;
for(k=0;k<len;k++)
cout<<array[k]<<",";
cout<<endl;
finish=clock();
totaltime=(double)(finish-start);
cout<<"总共花费时间:"<<totaltime<<"毫秒"<<endl;
system("pause");
return 0;
}