#define MAX_SIZE 100
#include <iostream>
#include <ctime>
using namespace std;
//交换指针p1,p2指向的值
void exchange(int *p1,int *p2)
{
int temp=*p1;
*p1=*p2;
*p2=temp;
}
//pa为指向A[]的数组,p,r为下标,对A[p..r]进行就地重排,以A[r]为主元
//划分为小于主元和大于主元的两部分,返回主元的下标q
//例如:A[1..6]={18,8,16,6,9,10}结果:A[1..6]={8,6,9,10,18,16} q=4
//(元素顺序可能与结果不一致,但小于10的元素在10前面,大于10的元素在10后面)s
int partition(int *pa,int p,int r)
{
int x=*(pa+r); //主元
int i=p-1,j; //i表示小于主元的最后一个元素q
for(j=p;j<r;j++)
{
if(*(pa+j)<x)
{
i++;
exchange((pa+i),(pa+j));
}
}
exchange((pa+r),(pa+i+1));
return i+1;
}
// 快速排序的随机化版本
int randomized_partition(int *pa,int p,int r)
{
int i;
srand(unsigned(time(NULL)));
for(i=0;i<r-p+1;i++)
{
if(rand()==i){
exchange((pa+r),(pa+i));
break;
}
}
return partition(pa,p,r);
}
/////////////////////////////////////////////////////////////////////
//快速排序
/*
void quick_sort(int *pa,int p,int r)
{
if(p<r)
{
int q=partition(pa,p,r);
quick_sort(pa,p,q-1);
quick_sort(pa,q+1,r);
}
} */
void randomized_quicksort(int *pa,int p,int r)
{
if(p<r)
{
int q=randomized_partition(pa,p,r);
randomized_quicksort(pa,p,q-1);
randomized_quicksort(pa,q+1,r);
}
}
int main()
{
int A[MAX_SIZE],i;
for(i=1;i<=10;i++)
A[i]=11-i;
int *pa=A;
//快速排序
randomized_quicksort(pa,1,10);
for(i=1;i<=10;i++)
cout<<A[i]<<endl;
return 1;
}
评论