/*qsort1至qsort3都是同一种思路,只是变换了不变式invariant罢了*/
/*分割点a[u].
invariant:a[l,m)<t && a[m,i)>=t, for each i in [l,u)*/
void qsort1(int a[],int l,int u){ if(l>=u) return; int m=l; for(int i=l;i<u;i++){ if(a[i]<a[u]){ //a[i]<->a[m]; swap(a[i],a[m]); m++; } } swap(a[m],a[u]); qsort1(a,l,m-1); qsort1(a,m+1,u); }
/*分割点a[l].
invariant:a[l+1,m]<t && a(m,i)>=t, for each i in [l+1,u]*/
void qsort2(int a[],int l,int u){
if(l>=u) return; int m=l; for(int i=l+1;i<=u;i++){ if(a[i]<a[l]){ m++; //a[i]<->a[m]; swap(a[i],a[m]); } } swap(a[m],a[l]); qsort1(a,l,m-1); qsort1(a,m+1,u); }
/*分割点a[l].
invariant:a[l+1,m)<t && a[m,i)>=t, for each i in [l+1,u]*/
void qsort3(int a[],int l,int u){ if(l>=u) return; int m=l+1; for(int i=l+1;i<=u;i++){ if(a[i]<a[l]){ //a[i]<->a[m]; swap(a[i],a[m]); m++; } } m--; swap(a[m],a[l]); qsort1(a,l,m-1); qsort1(a,m+1,u); }
/*解决待排序数组中元素相同导致性能退化,方法是两端遍历,交换前面大于等于t的元素与后面的小于等于t的元素。*/ void qsort4(int a[],int l,int u){ if(l>=u) return; int t=a[l]; int i=l,j=u+1; while(true){ do{ i++; }while(i<=u&&a[i]<t); do{ j--; }while(a[j]>t); if(i>j) break; swap(a[i],a[j]); } swap(a[l],a[j]); qsort4(a,l,j-1); qsort4(a,j+1,u); }
//快速排序非递归实现,网易游戏2013笔试题 //方法一 void qs1(int a[],int begin,int end){ if(begin>=end) return; stack<int> s; s.push(begin); s.push(end); while(!s.empty()){ end=s.top(); s.pop(); begin=s.top(); s.pop(); int pivot=partition(a,begin,end); if(pivot-1>begin){ s.push(begin); s.push(pivot-1); } if(end>pivot+1){ s.push(pivot+1); s.push(end); } } } //方法二 void qs2(int a[],int begin,int end){ if(begin>=end) return; stack<int> s; while(begin<end||!s.empty()){ if(begin<end){ int pivot=partition(a,begin,end); if(pivot+1<end){ s.push(pivot+1); s.push(end); } end=pivot-1; } else{ end=s.top(); s.pop(); begin=s.top(); s.pop(); } } } //partition很简单 int partition(int a[],int l,int u){ int m=l; for(int i=l;i<u;i++){ if(a[i]<a[u]){ //a[i]<->a[m]; swap(a[i],a[m]); m++; } } swap(a[m],a[u]); return m; }