1. 程式人生 > 其它 >演算法基礎之快速排序

演算法基礎之快速排序

快速排序(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
}