選取數組S中的一個元素做爲主元(pivot)v,分別與v比大小,將集合S-{v}分割成Sa和Sb: Sa<=pivot<=Sb數組
- k <= |Sa|,return QuickSelect( Sa,k) /
- k = 1+|Sa|,主元爲第K個數
- 第k小的數在Sb中,return QuickSelect(Sb,k-|Sa|-1)
void QuickSelect( int s[], int k, int left, int right){ int i,j,pivot; if( left<=right){ pivot = median3( s, left, right); i=left; j=right-1; for(;;){ while( s[++i] < pivot) ; while( s[--j] > pivot) ; if( i < j) swap( s[i], s[j]); else break; //劃分好了 } //重置主元 swap( s[i], s[right-1]); if( k<=i) QuickSelect( s, k, left, i-1); //對應 1 else if( k> i+1) QuickSelect( s, k, i+1, right); //對應 3 } else //若left>right,調整 InsertSort( s+left, right-left+1); }