快排的原理不詳細敘述了,這裏的重點是如何利用協程提升快排的速度:數組
快排利用分治的思想,這裏數組/切片分爲兩個部分,左邊比哨兵小,右邊比哨兵大,而後遞歸執行快排函數,這裏有個很重要的因素是若是遞歸調用的時候用協程執行,左半部分數組和右半部分的數組分別傳入做參數,因此不用考慮數據的同步問題。效果就像是一個協程調2個,兩個調4個,4個調8個。時間複雜度會明顯下降。函數
使用線程快排和使用協程快排會有什麼區別,因爲系統限制,線程的建立是有限的,當數組長度一旦很大,速度回明顯下降,可是協程不會,測試了一個100w的隨機數數組,排序的時間也只是在10ms左右。測試
測試以下:ui
package main import "math/rand" import "fmt" import "time" func quickSort(values []int,left,right int){ temp:=values[left] p:=left i,j:=left,right for i<=j{ for j>=p && values[j]>=temp{ j-- } if j>=p{ values[p]=values[j] p=j } for i<=p && values[i]<=temp{ i++ } if i<=p{ values[p]=values[i] p=i } } values[p]=temp if p-left>1{ quickSort(values,left,p-1) //go quickSort(values,left,p-1) } if right-p>1{ quickSort(values,p+1,right) //go quickSort(values,p+1,right) } } func QuickSort(values []int){ quickSort(values,0,len(values)-1) } func main(){ ceshi :=make([]int,10000) for i:=0 ; i<100; i++ { ceshi[i]=rand.Intn(100) } start_time :=time.Now() QuickSort(ceshi) end_time :=time.Since(start_time) fmt.Println("after sort",ceshi) fmt.Println("count time ",end_time) }
使用協程的時間在1ms左右,不適用協程的時候在40ms做用,這裏有一點不嚴謹的是兩次都是不同的隨機數組,會有點差別,可是這是數量級的差別。線程
結論,使用協程的快排,能明顯提升快排速度。code