排序 快速排序的優化(三分取中法實現)

2021-09-11 07:07:05 字數 1837 閱讀 8559

優化一:當待排列序列的長度分割到一定大小時,使用插入排序

原因:對於很小和部分有序的陣列,快排不如插入排序好。當待排序序列的長度分割到一定大小後,繼續使用分割的效率比插入排序要差; 但是三分取中+插入排序還不能處理重複陣列;

優化二:聚集相同基準法;處理重複的陣列元素

原因:在一次分割結束後,可以把與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...