快速选择算法通常用来在未排序的数组中寻找第k小/第k大的元素。其方法类似于快速排序。快速选择和快速排序都是Tony Hoare发明的,因此也称为Hoare’s algorithm。
下面是Madagascar中对快速选择算法的实现部分:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| float sf_quantile(int q /* quantile */,
int n /* array length */,
float* a /* array [n] */)
/*< find quantile (caution: a is changed) >*/
{
float *i, *j, ak, *low, *hi, buf, *k;
low=a;
hi=a+n-1;
k=a+q;
while (low<hi) {
ak = *k;
i = low; j = hi;
do {
// 找出a[i]>=ak 时的i值
while (*i < ak) i++;
// 找出a[j]>=ak 时的j值
while (*j > ak) j--;
// 交换 a[i]与a[j]的值,并移动i和j
if (i<=j) {
buf = *i;
(*i)++ = *j;
(*j)-- = buf;
}
} while (i<=j);
// 更新low 和 hi
if (j<k) low = i;
if (k<i) hi = j;
}
return (*k);
}
|
参考资料
Quick Select Algorithm快速选择算法
选取第K大数的快速选择算法和注意事项
维基百科
Madagascar