最坏情况下O(n^2)每一次都有一个子序列是空的,另一个是满的
平均情况和最好情况均为O(nlgn)
取两端与中间的元素中间的哪个为主元,主元放在倒数第二
void swamp(Element *a,Element *b){
Element tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
Element median3(Element a[],int begin,int end){
int mid;
mid = (begin + end)/2;
if(compare(a[begin],a[mid])>0)
swamp(&a[begin],&a[mid]);
if(compare(a[begin],a[end])>0)
swamp(&a[begin],&a[end]);
if(compare(a[mid],a[end])>0)
swamp(&a[mid],&a[end]);
swamp(&a[mid],&a[end-1]);
return a[end-1];
}
void Insertsort(Element a[],int n){
int i,j;
Element tmp;
for(i = 1;i<n;i++){
tmp = a[i];
for(j = i;j>0&&compare(tmp,a[j-1])<0;j--)
a[j] = a[j-1];
a[j] = tmp;
}
}
void partition(Element a[],int begin,int end){
int i,j;
Element pivot;
if(end - begin>4){
pivot = median3(a,begin,end);
i = begin;
j = end-1;
while(1){
while(compare(a[++i],pivot)<0);
while(compare(a[--j],pivot)>0);
if(i<j)
swamp(&a[i],&a[j]);
else break;
}
swamp(&a[i],&a[end-1]);
partition(a,begin,i-1);
partition(a,i+1,end);
}
else Insertsort(a + begin,end - begin + 1); //the array start from a + begin
}
void quicksort(Element a[],int n){
partition(a,0,n-1);
}