选取数组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); }