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

2021-09-08 06:23:15 字數 2933 閱讀 6738

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

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

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

原因:在一次分割結束後,可以把與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兩個子串行進行快排

實現**:

class

test

if(low>=high)

else

while

(low<=tmp)

if(low>=high)

else

} array[low]

=tmp;

return low;

}public

static

void

swap

(int

array ,

int low,

int rand)

/* * @description : 三分取中法

* @param array

* @param low

* @param high

* @return : void

* @exception :

* @date : 2019/1/9 12:48

*/public

static

void

midthree

(int

array,

int low,

int high)

if(array[low]

>array[high])if

(array[mid]

>array[high])}

public

static

void

insertsort

(int

array,

int low,

int high)

else

} array[j+1]

=tmp;}}

public

static

int[

]focusparnum

(int

array,

int par,

int low,

int high,

int left,

int right)

left--;}

}for

(int i = par+

1; i <=high ; i++

) right++;}

}int

brr=

newint[2

];brr[0]

=left;

brr[1]

=right;

return brr;

}public

static

void

quick

(int

array,

int low,

int high)

midthree

(array,low,high)

;int par=

partition

(array,low,high)

;int left=par-1;

int right=par+1;

int[

] brr=

focusparnum

(array,par,low,high,left,right)

; left=brr[0]

; right=brr[1]

;if(left > low)

if(right < high)

}public

static

void

quicksort

(int

array)

public

static

void

main

(string [

] args)

quicksort

(array)

;quicksort

(array)

; system.out.

println

(arrays.

tostring

(array));

}}

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

優化一 當待排列序列的長度分割到一定大小時,使用插入排序 原因 對於很小和部分有序的陣列,快排不如插入排序好。當待排序序列的長度分割到一定大小後,繼續使用分割的效率比插入排序要差 但是三分取中 插入排序還不能處理重複陣列 優化二 聚集相同基準法 處理重複的陣列元素 原因 在一次分割結束後,可以把與p...

資料結構 排序 快速排序

對序列 47,31,83,91,57,18,96,16 進行快速排序 首元素為基準 第二趟排序結果是 正確答案 b 你的答案 c 錯誤 18 31 16 47 57 91 96 83 16 31 18 47 57 91 96 83 16 18 31 47 57 91 96 83 16 18 31 4...

資料結構 排序 快速排序

快速排序在平均情況下是效果最好的排序演算法 每趟子表的排序都是從兩頭向中間交替逼近,接下來舉乙個例子 sorry,上面這個圖的6和5的位置畫反啦,快速排序全域性有序,一趟排序便可以確定基準值的最終位置 類別排序方法 最好時間 最壞時間 平均時間 空間複雜度 穩定性序列特徵 適用於插入排序 直接插入排...