1. using priortyqueue. priortyqueue是没有固定size的.
http://wlh0706-163-com.iteye.com/blog/1850125 源码
PriorityQueue(int initialCapacity, Comparator<? super E> comparator) 默认 o1 -o2 0,1,2,3,4,5 Comparator<Integer> Mycom; Mycom = new Comparator<Integer>(){ @Override public int compare(Integer o1, Integer o2) { // TODO Auto-generated method stub return o2-o1; } }; 5,4,3,2,1,0 public class test2 { private int[] n; test2(){ n = new int[]{1,9,8,4,0,2}; } // priorityqueue是没有固定size的. private void selectKmax1(int k) { PriorityQueue<Integer> pq = new PriorityQueue<Integer>(); for(int i = 0; i < k; i++) { //前k个数入队 pq.offer(n[i]); } for(int i = k; i < n.length; i++) { if(n[i] > pq.peek()) { //有大的就往里填数据 pq.poll(); pq.offer(n[i]); } } System.out.println("-----------PriorityQueue------------"); while(pq.size() > 0) { System.out.print(pq.poll()+" "); } System.out.println(); } public void insert(int k){ Comparator<Integer> Mycom; Mycom = new Comparator<Integer>(){ @Override public int compare(Integer o1, Integer o2) { // TODO Auto-generated method stub return o2-o1; } }; PriorityQueue<Integer> pq = new PriorityQueue<Integer>(); for(int i: n){ pq.add(i); PriorityQueue<Integer> buf = new PriorityQueue<Integer>(3,Mycom); buf.addAll(pq); System.out.println("-----------PriorityQueue------------"); while(buf.size()!=0){ System.out.print(buf.poll() + " "); } } }
quick sort:
http://www.youtube.com/watch?v=39BV3_DONJc
public class Quicksort { private static <T extends Comparable<T>> int split(T[] list, int lo, int hi) { int left=lo+1; int right=hi; T pivot = list[lo]; while (true) { while (left <= right) { if (list[left].compareTo(pivot) < 0) { left++; } else { break; } } while(right > left) { if (list[right].compareTo(pivot) < 0) { break; } else { right--; } } if (left >= right) { break; } // swap left and right items T temp = list[left]; list[left] = list[right]; list[right] = temp; //advance each one step left++; right--; } // swap pivot with left-1 position list[lo] = list[left-1]; list[left-1] = pivot; // return the split point return left-1; } private static <T extends Comparable<T>> void sort(T[] list, int lo, int hi) { if ((hi-lo) <= 0) { // fewer than 2 items return; } int splitPoint = split(list,lo,hi); sort(list,lo,splitPoint-1); // left subarray recursion sort(list,splitPoint+1,hi); // right subarray recursion } public static <T extends Comparable<T>> void sort(T[] list) { if (list.length <= 1) { return; } sort(list,0,list.length-1); } }
- //解法二,选择排序,排前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();
- }