1.简介
查找集合S中第k个最小元。
平均O(NlogN)
最坏O(N2)
2.实现
/*
选择第k个最小元
*/
/* START: fig7_16.txt */
/* Places the kth smallest element in the kth position */
/* Because arrays start at 0, this will be index k-1 */
void Qselect(ElementType A[], int k, int Left, int Right)
{
int i, j;
ElementType Pivot;
if (Left + Cutoff <= Right)
{
Pivot = Median3(A, Left, Right);
i = Left; j = Right - 1;
for (;;)
{
while (A[++i] < Pivot){}
while (A[--j] > Pivot){}
if (i < j)
Swap(&A[i], &A[j]);
else
break;
}
Swap(&A[i], &A[Right - 1]); /* Restore pivot */
if (k <= i)
Qselect(A, k, Left, i - 1);
else if (k > i + 1)
Qselect(A, k, i + 1, Right);
}
else /* Do an insertion sort on the sub array */
InsertionSort(A + Left, Right - Left + 1);
}
/* END */
ElementType QuickSelect(ElementType A[], int k, int N)
{
Qselect(A, k, 0, N - 1);
return A[k - 1];
}