快速排序法(golang實現)
阿新 • • 發佈:2018-12-12
快速排序是由東尼·霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要Ο(n log n)次比較。在最壞狀況下則需要Ο(n2)次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他Ο(n log n) 演算法更快,因為它的內部迴圈(inner loop)可以在大部分的架構上很有效率地被實現出來,且在大部分真實世界的資料,可以決定設計的選擇,減少所需時間的二次方項之可能性。
package test import ( "fmt" "testing" ) func TestFastSort(t *testing.T) { testArr := []int{2, 5, 3, 7, 4, 5, 8, 1, 4, 0} testSort(testArr, 0, len(testArr)-1) fmt.Println(testArr) } /** 快速排序:分治法+遞迴實現 隨意取一個值A,將比A大的放在A的右邊,比A小的放在A的左邊;然後在左邊的值AA中再取一個值B,將AA中比B小的值放在B的左邊,將比B大的值放在B的右邊。以此類推 */ func quickSort(arr []int, first, last int) { flag := first left := first right := last if first >= last { return } // 將大於arr[flag]的都放在右邊,小於的,都放在左邊 for first < last { // 如果flag從左邊開始,那麼是必須先從有右邊開始比較,也就是先在右邊找比flag小的 for first < last { if arr[last] >= arr[flag] { last-- continue } // 交換資料 arr[last], arr[flag] = arr[flag], arr[last] flag = last break } for first < last { if arr[first] <= arr[flag] { first++ continue } arr[first], arr[flag] = arr[flag], arr[first] flag = first break } } quickSort(arr, left, flag-1) quickSort(arr, flag+1, right) }