#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后面)sint 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;}

评论