java中快速排序的優化
阿新 • • 發佈:2019-02-04
接上節講的快速排序,我們來了解一下幾種它的優化。
1.隨機取基準
上節我們採取的是以開頭為基準,然後進行一次快速排序,但是如果原陣列相對有
序的話,那麼就會出現每次找基準,原陣列順序不變,時間複雜度相當的高,為了處
理這種情況我們採用隨機選取基準,就是
public static void new_Quick(int[] array,int low,int high){ swap(array,low,rand.nextInt(high-low+1)+low); //因為不知道起始位置,所以後面加上low int par = partion(array,low,high); if(par > low+1){ Quick(array,low,par); } if(par < high-1){ Quick(array,par+1,high); } } public static void swap(int[] array,int start,int end){ int tmp = array[start]; array[start] = array[end]; array[end] = tmp; }
2.當前陣列中的值過少可以採取直接快速排序法
這種方法我們就不多做介紹了,我們可以自己確定一個數,比如十,少於十的時
候,直接呼叫快速排序的方法。
3.聚集相同元素法
經常會出現一個數組中有很多個相同的元素,為了方便和加速遞迴,相同的元素我
們可以不用再次遞迴,直接放在基準的左右位置。
以如圖為例,我們發現第一次的基準12,有很多相同的元素,那我們遍歷的時候可以
將12放在他的周圍,然後從除12的數字遍歷
然後就是程式碼實現:
public static int [] fun(int []array,int right,int left,int start,int end,int par){ int parRight = par-1; int parleft = par+1; int tmp = 0; for(int i = parleft;i>=start;i--){ if(array[par] == array[i]){ if(i != parleft){ tmp = array[parleft]; array[parleft] = array[i]; array[i] = tmp; parleft--; } }else{ parleft--; } } left = parleft; for(int j = parRight;j<=end;j++){ if(array[par] == array[j]){ if(j != parleft){ tmp = array[parRight]; array[parRight] = array[j]; array[j] = tmp; parRight++; } }else{ parRight++; } } right = parRight; int a[] = {left,right}; return a; }
如有錯誤,請多多指教。