優化一:當待排列序列的長度分割到一定大小時,使用插入排序
原因:對於很小和部分有序的陣列,快排不如插入排序好。當待排序序列的長度分割到一定大小後,繼續使用分割的效率比插入排序要差; 但是三分取中+插入排序還不能處理重複陣列;
優化二:聚集相同基準法;處理重複的陣列元素
原因:在一次分割結束後,可以把與par相等的元素聚集在一起。下次分割時,不用在對和par相等元素進行分割
舉例:待排序序列 1 4 6 7 6 6 7 6 8 6
三數取中選取樞軸:下標為4的數6
轉換後,待分割序列:6 4 6 7 1 6 7 6 8 6
樞軸par:6
本次劃分後,未對與par元素相等處理的結果:1 4 6 6 7 6 7 6 8 6
下次的兩個子串行為:1 4 6 和 7 6 7 6 8 6
本次劃分後,對與key元素相等處理的結果:1 4 6 6 6 6 6 7 8 7
下次的兩個子串行為:1 4 和 7 8 7
經過對比,我們可以看出,在一次劃分後,把與par相等的元素聚在一起,能減少迭代次數,效率會提高不少
具體過程:在處理過程中,會有兩個步驟
劃分結束後,把與par相等的元素移到par周圍
舉例:待排序序列 1 4 6 7 6 6 7 6 8 6
三數取中選取樞軸:下標為4的數6
轉換後,待分割序列:6 4 6 7 1 6 7 6 8 6
樞軸par:6
劃分結束後,把與par相等的元素移到樞軸周圍
結果為:1 4 66(樞軸) 6 6 6 7 8 7
此時,與6相等的元素全移到樞軸周圍了,之後在對14和787兩個子串行進行快排
之後,在1 4 和 7 8 7兩個子串行進行快排
/**
* @author 《boyou》
* @description 快排的優化
* 當資料小於100的時候,用直接插入
* 海量資料時,每次取到par時,左右各迴圈
* 將與par相同的值都移動到par附近,則下次排序
* 就會從不相同的臨界值開始
* @date 2019/1/10 -- 下午 8:51
*/public class fastsort05
quicksort(array);
system.out.println(arrays.tostring(array));
}public static void quicksort(int array)
public static int foucsparnum(int array,int par,int low,int high)
left--;}}
for (int j = par+1; j low)
if (right=low ; j--) else
}array[j+1]=tmp;}}
//三分取中法實現原理:
//array[mid]<=array[low]<=array[high];
public static void midthree(int array,int low,int high)
if (array[mid]>array[high])
if (array[low]>array[high])
}public static void swap(int array ,int low,int rand)
public static int parvion(int array,int low,int high)
if (low}
array[low]=tmp;
return low;
}}
資料結構 排序 快速排序的優化(三分取中法實現)
優化一 當待排列序列的長度分割到一定大小時,使用插入排序 原因 對於很小和部分有序的陣列,快排不如插入排序好。當待排序序列的長度分割到一定大小後,繼續使用分割的效率比插入排序要差 但是三分取中 插入排序還不能處理重複陣列 優化二 聚集相同基準法 處理重複的陣列元素 原因 在一次分割結束後,可以把與p...
演算法筆記(三) 分治法(快速排序)
參考了網上大神的理解後,自己也嘗試著寫下傳說中的 快速排序 大致思路總結為 挖坑填坑 分治法。舉個例子 我們對陣列a 9 進行分析。首先我們拿陣列中的隨機乙個數作為基準數 參照物件,也就是要挖的坑 把基準數變成坑 用 x 來表示 然後我們把它和陣列的第乙個數字置交 比如我們拿到的基準數為5,那麼新陣...
三種快速排序以及快速排序的優化
1 快速排序的基本思想 快速排序使用分治的思想,通過一趟排序將待排序列分割成兩部分,其中一部分記錄的關鍵字均比另一部分記錄的關鍵字小。之後分別對這兩部分記錄繼續進行排序,以達到整個序列有序的目的。2 快速排序的三個步驟 1 選擇基準 在待排序列中,按照某種方式挑出乙個元素,作為 基準 pivot 2...