快速选择算法是基于快速排序算法的,目的是寻找一个无序表内的第k大(小)的元素。
快速排序:
快速排序的原理是把每次一个无序表以一个目标节点为中心,向左放比它小的,向右放比它大的。重复这一过程,就可以得到一个有序表。快速选择:
当快速排序要进行递归时,此时目标节点的下标m就是它在这个表内的位置。所以,我们可以通过比较k与m的关系,判断下一步应往那一个方向拓展,直到k=m,程序结束,返回该元素。
下面给出代码:
int QuickSelect(int *a, int left, int right, int k)
{
int mark = a[ left ];
int i = left;
int j = right;
while( i < j )
{
while ( a[j] >= mark && i < j )
j--;
a[i] = a[j];
while ( a[i] <= mark && i < j )
i++;
a[j] = a[i];
}
a[i] = mark;
if( k < i + 1 )
return QuickSelect( a, left, i - 1 , k);
else if( k > i + 1 )
return QuickSelect( a, i + 1, right, k);
else
return a[i];
}