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