quick sort and find the k largest number in array.

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

 

 

  1.     //解法二,选择排序,排前k个即可,当k 不是很大时效率应该不错  
  2.         private void selectMax2(){  
  3.             int index;  
  4.             long temp;  
  5.             for(int i=0;i<k;i++){//只需要循环k次即可  
  6.                 index=i;  
  7.                 for(int j=i+1;j<n.length;j++){  
  8.                     if(n[j]>n[index])index=j;  
  9.                 }  
  10.                 if(index!=i){//说明需要交换  
  11.                     temp=n[i];  
  12.                     n[i]=n[index];  
  13.                     n[index]=temp;  
  14.                 }  
  15.             }  
  16.             System.out.println("------选择排序结果--------");  
  17.             for(int i=0;i<k;i++)System.out.print(n[i]+" ");  
  18.             System.out.println();             
  19.         }    

posted on 2014-10-28 08:11  brave_bo  阅读(156)  评论(0编辑  收藏  举报

导航