1. 程式人生 > >資料結構-排序-快速排序之隨機選取基準法

資料結構-排序-快速排序之隨機選取基準法

思想:基本的快速排序選取第一個或者最後一個元素作為基準。這樣在陣列已經有序的情況下,每次劃分將得到最壞的結果。一種比較常見的優化方法是隨機化演算法,即隨機選取一個元素作為基準。這種情況下雖然最壞情況仍然是O(n2),但最壞情況不再依賴於輸入資料,而是由於隨機函式取值不佳。實際上,隨機化快速排序得到理論最壞情況的可能性僅為1/(2n)。所以隨機化快速排序可以對於絕大多數輸入資料達到O(nlogn)的期望時間複雜度。

實現程式碼如下:

class Test{
    /*
       * @Description :  一趟快速排序
       * @param array
      * @param low
      * @param high
       * @return :   int
       * @exception :
       * @date :   2019/1/9 11:22
       */
     public static int partion(int [] array,int low,int high){

         int tmp=array[low];
         while(low<high){
             while(low<high && array[high]>tmp){
                 high--;
             }
             if(low>=high){
                 break;
             }else{
                 array[low]=array[high];
             }
             while(low<high&&array[low]<tmp){
                 low++;
             }
             if(low>=high){
                 break;
             }else{
                 array[high]=array[low];
             }
         }
         array[low]=tmp;
         return low;
     }
     public static void swap(int []array ,int low,int rand){
         int tmp=array[low];
         array[low]=array[rand];
         array[rand]=tmp;
     }
     public static void quick(int [] array,int low,int high){
         Random random=new Random();
         int randNum=random.nextInt(high-low)+low+1; //low 和 high之間的所有隨機數
         swap(array,low,randNum);
         int par=partion(array,low,high);  //下一趟排序新的基準
         if(par>low+1){
             quick(array,low,par-1);
         }
         if(par<high-1){
             quick(array,par+1,high);
         }
     }
     public static void quickSort(int [] array){ 
         quick(array,0,array.length-1);
     }
     public static void main(String [] args){
         int array []=new int[10000];
         Random random=new Random();
         for(int i=0;i<array.length;i++){
             array[i]=random.nextInt(10000)+1;
         }
         quickSort(array);
     }
    }