func Quicksort(data []int) []int {
if len(data)<=1 {
return data
}
var max,min []int
middle:=data[0]
// 等待goroutine都运行完毕
var WG sync.WaitGroup
for index,value:=range data{
if index==0 {
continue
}
if value>middle{
max=append(max,value )
}else{
min=append(min,value)
}
}
//
WG.Add(2)
go func() {
max=Quicksort(max)
WG.Done()
}()
go func() {
min=Quicksort(min)
WG.Done()
}()
WG.Wait()
list:=[]int{middle}
if len(max)>0 {
list= append(list,max...)
}
if len(min) >0{
list=append(min,list... )
}
return list
}
func main() {
data:=[]int{1,3,4,2,55,8,6,52,55}
fmt.Println(Quicksort(data))
}
[1 2 3 4 6 8 52 55 55]
WaitGroup 对象内部有一个计数器,最初从0开始,它有三个方法:Add(), Done(), Wait() 用来控制计数器的数量。Add(n) 把计数器设置为n ,Done() 每次把计数器-1 ,wait() 会阻塞代码的运行,直到计数器地值减为0。
WaitGroup对象不是一个引用类型,在通过函数传值的时候需要使用地址
一定要通过指针传值,不然进程会进入死锁状态