優化一:當待排列序列的長度分割到一定大小時,使用插入排序
原因:對於很小和部分有序的陣列,快排不如插入排序好。當待排序序列的長度分割到一定大小後,繼續使用分割的效率比插入排序要差; 但是三分取中+插入排序還不能處理重複陣列;
優化二:聚集相同基準法;處理重複的陣列元素
原因:在一次分割結束後,可以把與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的位置畫反啦,快速排序全域性有序,一趟排序便可以確定基準值的最終位置 類別排序方法 最好時間 最壞時間 平均時間 空間複雜度 穩定性序列特徵 適用於插入排序 直接插入排...