演算法基礎之快速排序
阿新 • • 發佈:2021-07-17
快速排序(QuickSort)
基本思想
1、選定Pivot中心軸( 選取一個數作為基準數,一般取第一個數)
2、將大於Pivot的數字放在Pivot的右邊
3、將小於Pivot的數字放在Pivot的左邊
4、分別對左右子序列重複前三步操作,直到各區間只有一個數
排序過程解析
例:[7,3,29,5,9] 第一次: 選取第一個元素7為Pivot 定義左右指標,分別指向第一個和最後一個元素 將右指標指向元素9與7比較 比元素7大,所以9還是放到右指標位置不動,右指標向前移動一位 將右指標指向元素5與7比較 比元素7小,所以5移動到左指標位置,左指標向後移動一位 將左指標指向元素3與7比較 比元素3小,所以3還是放到左指標位置不動,左指標向後移動一位 將左指標指向元素29與7比較 比元素7大,所以29移動到右指標位置,右指標向前移動一位 左右指標相遇,第一次排序結束: 結果 = [5、3、7、29、9] 遞: 左 [5、3],右 [29、9] 重複上面步驟... 左 [3、5],右 [9、29] 歸: [3,5,7,9,29]
複雜度
最好時間複雜度為:O(nlogn) 最差 O(n^2) 空間複雜度 log(n) 快排是一種非穩定排序
程式碼解析
func QuickSort(list []int,begin int,end int) { if begin < end{ // 切分排序 loc := partition(list,begin,end) // 遞迴排序左邊 QuickSort(list,begin,loc-1) // 遞迴排序右邊 QuickSort(list,loc+1,end) } } // 將陣列進行快速排序,返回排序後的中間元素索引 func partition(list []int,begin int,end int) int { // list[being]為基準元素,用來比較 // 定義左右指標 left := begin + 1 right := end // 當左右兩指標重合時結束 for left < right{ // 判斷左指標元素是否大於基準元素,如果大於基準元素則左右指標元素交換位置,右指標--,否則左指標++ if list[left] > list[begin] { list[left],list[right] = list[right],list[left] right-- }else{ left++ } } // 當前左右指標重合,指向元素左邊的都是小於基準元素的,右邊的都是大於基準元素的 // 這裡需要判斷,指向元素是否比基準元素大,如果大於等於基準元素,那麼left左移一格,將基準元素與比他小的元素替換位置 // 如果小於基準元素,那麼不需要移動,直接將指向元素和基準元素替換位置即可 if list[left] >= list[begin]{ left-- } list[begin],list[left] = list[left],list[begin] return left }