快速排序的研究一直在继续,研究的关键就是其基准点base的选取。对base点取随机数可以获得较好的平均情况性能。
代码如下:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
//函数原型
void swap(int *a,int *b);
int partition(int A[],int start,int end);
int randomized_partition(int A[],int start,int end);
void randomized_quick_sort(int A[],int start,int end);
int random(int start,int end);
//测试代码
int main()
{
int test[11]={-1,2,5,6,7,8,9,1,4,3,10};
randomized_quick_sort(test,1,10);
for(int i=1;i<11;i++)
printf("%d ",test[i]);
getch();
}
//划分区域
int partition(int A[],int start,int end)
{
int base=A[end];//以最后一个数作为划分的基点
int i=start-1;
for(int j=start;j<end;j++)
{
if(A[j]<=base)
{
i++;
swap(&A[i],&A[j]);
}
}
swap(&A[i+1],&A[end]);
return i+1;
}
//随机得到基数值
int randomized_partition(int A[],int start,int end)
{
int t=random(start,end);
swap(&A[t],&A[end]);
return partition(A,start,end);
}
//快排的随机化版本
void randomized_quick_sort(int A[],int start,int end)
{
if(start<end)
{
int t=randomized_partition(A,start,end);
randomized_quick_sort(A,start,t-1);
randomized_quick_sort(A,t+1,end);
}
}
//交换
void swap(int *a,int *b)
{
int temp=*a;
*a=*b;
*b=temp;
}
//得到start到end之间的随机整数
int random(int start,int end)
{
int t;
srand(time(NULL));
while(true)
{
t=rand()%(end+1);
if(t>=start)
return t;
}
}