java quickselect_QuickSelect

QuickSelect : 快速选择,在线性时间内查找第k个位置的元素。

算法目的: 数组长度为n,查找第k个元素

复杂度:o(N)

算法:

1,从数组中随机选定一个元素x,大于x的分成一组,记做smaller,小于x的分成一组,记做larger

2,如果 smaller的长度等于k-1,说明x是第k个位置的元素

3,如果 smaller的长度大于等于k,从smaller中找到第k个元素

4,如果smaller的长度 + 1 小于k,从larger中找第k-1 - smaller长度位置的元素

算法的最大比较次数不超过4n

Java 代码:

package alg.analysis;

import java.util.ArrayList;

import java.util.List;

public class QuickSelect {

public static int quickSelect(List datas, int k){

assert (k>=1&&k<=datas.size());

List smallers = new ArrayList();

List largers = new ArrayList();

int valueMark = datas.get(0);

for (int i=1;i

if(datas.get(i)>valueMark){

largers.add(datas.get(i));

}

if(datas.get(i)<=valueMark){

smallers.add(datas.get(i));

}

}

if (smallers.size() >= k) {

return quickSelect(smallers, k);

}

if (smallers.size() +1 < k) {

return quickSelect(largers, k-smallers.size()-1);

}

return valueMark;

}

public static void main(String []args){

List datas = new ArrayList();

datas.add(3);

datas.add(2);

datas.add(1);

datas.add(7);

datas.add(6);

datas.add(5);

datas.add(4);

int fifth = quickSelect(datas, 5);

System.out.println(fifth);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值