先实现了一下快速排序,代码就不贴了,网上可以找到不错的
思路跟书上的解法二伪代码一样
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package Test;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
*
* @author Administrator
*/
public class SearchKNumbers {
public static void main(String[] args) {
int[] arry = {45, 67, 305, 12, 78, 102, 29, 88, 91, 55, 100, 38, 99, 59, 203, 12};
int k = 4;
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < arry.length; i++) {
list.add(arry[i]);
}
List l = Kbig(list, k);
for (int i = 0; i < l.size(); i++) {
System.out.print(l.get(i) + " ");
}
}
private static List Kbig(List<Integer> list, int k) {
if (k <= 0) {
return null;
}
if (list.size() <= k) {
return list;
}
List l = Partition(list);
List<Integer> la = Kbig((List<Integer>) l.get(0), k);
List<Integer> lb = Kbig((List<Integer>) l.get(1), k - la.size());
if (lb != null)
la.addAll(lb);
return la;
}
private static List<List<Integer>> Partition(List<Integer> list) {
List<Integer> sa = new ArrayList();
List<Integer> sb = new ArrayList();
Random random = new Random();
int result = random.nextInt(list.size());
int p = list.get(result);
for (int i = 0; i < list.size(); i++) {
if (list.get(i) > p) {
sa.add(list.get(i));
}
if (list.get(i) < p) {
sb.add(list.get(i));
}
}
if (sa.size() < sb.size()) {
sa.add(p);
} else {
sb.add(p);
}
List<List<Integer>> l = new ArrayList();
l.add(sa);
l.add(sb);
return l;
}
}