通常解決的問題是求一個n個數的列表中第K個最小的元素。這個數字被稱爲第K個順序統計量。數組
//對數組元素data[lowhigh]進行分區操做,0號單元不用 int partion(int data[],int low,int high) { data[0]=data[low]; int pivotkey=data[low]; while(low<high) { while(low<high&&data[high]>=pivotkey) --high; data[low]=data[high]; while(low<high&&data[low]<=pivotkey) ++low; data[high]=data[low]; } data[low]=data[0]; return low; } /*查找data[pr]中第k大的數. **平均狀況下,它比快速排序應該要快,由於分區以後只用處理一個子數組,而 **而快速排序要處理兩個獨立的子數組。 **T(n)=T(n/2)+(n+1) **T(n)=O(n) */ int lineselect(int data[],int p,int r,int k) { //p不能大於r if(p>r) return -1; if(p==r) return data[p]; //p<r int s=partion(data,p,r); if (s==k) return data[s]; else if(s>k) { int r1= lineselect(data,p,s-1,k); return r1; } else //s<k { int r1=lineselect(data,s+1,r,k); return r1; } } /*快速排序: **T(n)=2T(n/2)+n **T(n)=nlogn */ void QSort(int *v,int low,int high) { int pivotloc=0; if(low<high) { pivotloc=Partition(L,low,high); QSort(v,low,pivotloc-1); QSort(v,pivotloc+1,high); } }