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);
}
}