来源:编程之美2.5
题目:寻找N个数中最大的k个数
书中提供的解法很多,有些用java实现起来还真有点难度,很帖两个解法吧,都是比较简单的,复杂的后面再补上。
//求N个数中最大的k个数
import java.util.PriorityQueue;
public class KMax2_5 {
private long []n;
private int maxNum = 100;
private int k = 5;
private final static int BOUND = 1000;
//生成测试数组
private void generateNumbers() {
n = new long[maxNum];
for(int i = 0; i < maxNum; i++) {
n[i] = Math.round(Math.random() * BOUND);
System.out.println(n[i]);
}
}
//解法一,利用JDK里的PriorityQueue队列,该队列会从小到大排列数据
//这种方式应该和自己建一个大小为k的数组,然后排好序,再插入排序的方式差不多。
private void selectKmax1() {
PriorityQueue pq = new PriorityQueue(k);
for(int i = 0; i < k; i++) { //前k个数入队
pq.offer(n[i]);
}
for(int i = k; i < maxNum; i++) {
if(n[i] > (Long)pq.peek()) { //有大的就往里填数据
pq.poll();
pq.offer(n[i]);
}
}
System.out.println("-----------PriorityQueue------------");
while(pq.size() > 0) {
System.out.print((Long)pq.poll()+" ");
}
System.out.println();
}
//解法二,选择排序,排前k个即可,当k 不是很大时效率应该不错
private void selectMax2(){
int index;
long temp;
for(int i=0;i<k;i++){//只需要循环k次即可
index=i;
for(int j=i+1;j<n.length;j++){
if(n[j]>n[index])index=j;
}
if(index!=i){//说明需要交换
temp=n[i];
n[i]=n[index];
n[index]=temp;
}
}
System.out.println("------选择排序结果--------");
for(int i=0;i<k;i++)System.out.print(n[i]+" ");
System.out.println();
}
public static void main(String[] args) {
KMax2_5 kmax = new KMax2_5();
kmax.generateNumbers();//产生maxNum个随机整数
kmax.selectKmax1();//
kmax.selectMax2();
System.out.println("Complete!");
}
}