最近像在看閒書同樣在看一本《啊哈!算法》算法
當時在amazon上面閒逛挑書,看到巨多人推薦這本算法書,說深刻淺出簡單易懂便買來閱讀。實際上做者描述算法的能力的確使人佩服。就當複習經常使用算法吧。數組
後面會依次紀錄一下我以爲有意思的經常使用算法使用,此次就是快排。函數
快速排序簡介:ui
快排的中心思想仍是二分法,經過partition算法,先將須要排序的數組分爲兩個部分,再用遞歸的思想反覆這個過程。最後將排序好的最小單元再依次組裝起來得到最後的數據。快排的平均時間複雜度是O(nlogN),最糟糕的狀況是O(N平方)。spa
Partition算法:指針
partition算法是一種分類算法,簡單來講就把一個序列分紅先後兩部分,前一部分都是知足某一條件的元素,後一部分都是不知足該條件的元素。最著名的應用可能就是快速排序中的partition了。咱們先找出一個元素,而後以該元素爲基準點將小於他的所有放置到一邊,將大於他的數所有放置到另一邊。最後返回pivot索引位置。這裏咱們默認使用數組的第一個數做爲pivot
code
下面來看快速排序中partition的實現:blog
func partition(left int, right int, list []int) (int) { i := left j := right temp := list[left] for i != j { for i < j && list[j] >= temp { j-- } for i < j && list[i] <= temp { i++ } if i < j { list[i], list[j] = list[j], list[i] } } list[left], list[i] = list[i], list[left]
return i }
咱們接收數組,左起始點,右結束索引做爲參數。排序
默認將數組的第一個數做爲索引點,而後將小於他的數放置在左邊,將大於他的數放置在右邊。遞歸
快速排序:
經過遞歸partition函數咱們就能始終將數分紅左右兩邊,最後再合併起來就能夠了。
因此實際快速排序只是在partition算法的基礎上使用遞歸法。最後獲取結果。上面的partition算法我使用了兩根指針同時從左右兩邊進行掃描。把掃描到的左右兩個數調換位置,從而二分效率。
完整的代碼:
func quickSort(left int, right int, list []int) { if left >= right { return } i := left j := right temp := list[left] for i != j { for i < j && list[j] >= temp { j-- } for i < j && list[i] <= temp { i++ } if i < j { list[i], list[j] = list[j], list[i] } } list[left], list[i] = list[i], list[left] quickSort(left, i, list) quickSort(i+1, right, list) return }
Reference:
《啊哈!算法》-> 啊哈磊著