GO利用協程提升快排的效率

快排的原理不詳細敘述了,這裏的重點是如何利用協程提升快排的速度:數組

    快排利用分治的思想,這裏數組/切片分爲兩個部分,左邊比哨兵小,右邊比哨兵大,而後遞歸執行快排函數,這裏有個很重要的因素是若是遞歸調用的時候用協程執行,左半部分數組和右半部分的數組分別傳入做參數,因此不用考慮數據的同步問題。效果就像是一個協程調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

相關文章
相關標籤/搜索