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<Integer> datas, int k){ assert (k>=1&&k<=datas.size()); List<Integer> smallers = new ArrayList<Integer>(); List<Integer> largers = new ArrayList<Integer>(); int valueMark = datas.get(0); for (int i=1;i<datas.size(); 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<Integer> datas = new ArrayList<Integer>(); 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); } }