《算法导论》——随机化快排RandomizedQuickSort
今日算法:随机化快排RandomizedQuickSort
基础工作swap交换和partition分治
/* *交换数组的两个元素 *fromIndex和toIndex为要交换的两个元素的索引 */ void swap(int *numArray,int fromIndex,int toIndex) { int temp=numArray[fromIndex]; numArray[fromIndex]=numArray[toIndex]; numArray[toIndex]=temp; } int partition(int *numArray,int head,int tail) { int x=numArray[tail]; int i=head-1; for(int j=head;j<tail;j++) { if(numArray[j]<=x) { i++; swap(numArray,i,j); } } swap(numArray,i+1,tail); return i+1; }
随机选择主元,快排
int randomizedPartition(int *numArray,int head,int tail) { int i=rand()%(tail-head+1)+head; swap(numArray,tail,i); return partition(numArray,head,tail); } void randomizedQuickSort(int *numArray,int head,int tail) { if(head<tail) { int q=randomizedPartition(numArray,head,tail); randomizedQuickSort(numArray,head,q); randomizedQuickSort(numArray,q+1,tail); } }
测试及结果:
#include "stdafx.h" #include <iostream> #include "RandomizedQuickSort.h" using namespace std; using namespace dksl; int _tmain(int argc, _TCHAR* argv[]) { int *a=new int[10]; for(int i=0;i<10;i++) a[i]=rand(); cout<<"排序前:"; for(int i=0;i<10;i++) cout<<a[i]<< " "; cout<<endl; randomizedQuickSort(a,0,9); cout<<"排序后:"; for(int i=0;i<10;i++) cout<<a[i]<< " "; cout<<endl; system("PAUSE"); return 0; }
必须注意的是,此算法排序的数组中不能出现重复的元素。