1.基本思想
选择问题:有一组N个数而要确定其中第k个最小(或最大)者
快速选择算法几乎与快速排序相同
算法步骤
以确定第k个最小者为例
- 如果N = 1,那么k = 1将数组中的元素返回
- 如果N小于等于CUTOFF(小数组的截止方法),那么将数组直接插入排序并返回第k个最小元素
- 如果不是上面的两种情况,那么选取枢轴
- 将数组分为左右两子数组(和快速排序一样)
- 如果k小于等于左子数组的长度,那么所求元素必在左子数组,对左子数组继续进行递归快速选择。
如果k等于左子树长度加一,那么枢轴就是所求元素。
如果k大于左子数组的长度,那么所求元素必在右子数组,对右子数组进行递归快速选择,此时k变为(k-左子数组长度-1)
2.算法实现
public static <AnyType extends Comparable<? super AnyType>> AnyType quickselect(AnyType[] a,int k)
{
quickselect(a, 0, a.length - 1, k);
return a[k - 1];
}
private static final int CUTOFF = 3;//截止范围
private static <AnyType extends Comparable<? super AnyType>> void quickselect(AnyType[] a, int left, int right, int k)
{
if(left + CUTOFF