go语言并发快速排序
时间: 2023-06-28 11:04:28 浏览: 67
以下是使用 Go 语言实现的快速排序算法,并发地处理输入的数组。
```go
package main
import (
"fmt"
"math/rand"
"sync"
"time"
)
func quickSort(arr []int, wg *sync.WaitGroup) {
defer wg.Done()
if len(arr) <= 1 { // 基线条件
return
}
pivot := arr[0] // 选择第一个元素为基准点
left, right := 0, len(arr)-1
for i := 1; i <= right; {
if arr[i] < pivot {
arr[left], arr[i] = arr[i], arr[left]
left++
i++
} else if arr[i] > pivot {
arr[right], arr[i] = arr[i], arr[right]
right--
} else {
i++
}
}
wg.Add(2)
go quickSort(arr[:left], wg) // 左半部分递归
go quickSort(arr[right+1:], wg) // 右半部分递归
}
func main() {
rand.Seed(time.Now().UnixNano())
var wg sync.WaitGroup
arr := []int{}
for i := 0; i < 10; i++ {
arr = append(arr, rand.Intn(100))
}
fmt.Println("Before sorting:", arr)
wg.Add(1)
go quickSort(arr, &wg)
wg.Wait()
fmt.Println("After sorting:", arr)
}
```
使用 `sync.WaitGroup` 来等待所有协程完成,每次递归会启动两个新协程并发地对左右两个半部分进行排序。注意每个协程都需要 `wg.Done()` 来通知 `WaitGroup` 完成一个任务。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)