go语言写的并行排序算法(快速排序)

ZHONGHUNZHAIZHUREN · · 4085 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

package main
import "fmt"
 
// threads 线程标识创建线程的个数
func quicksort(nums []int, ch chan int, level int, threads int) {
  level=level*2
  if len(nums) == 1 {  ch<- nums[0]; close(ch); return }//ch<-nums[0] 表示将nums[0] 数据写到ch通道中
  if len(nums) == 0 {  close(ch); return }
  
  less := make([]int, 0)//
  greater := make([]int,0)
  left := nums[0] //快速排序的轴
  nums = nums[1:] 

  //从左向右扫描数据 大于轴的放到greater里小于的放到less中
  for _,num_data := range nums{
    switch{
    case num_data <= left:
      less = append(less,num_data) 
    case num_data > left:
      greater = append(greater,num_data)
    }
  }

  left_ch := make(chan int, len(less)) 
  right_ch := make(chan int, len(greater))
  
  if(level <= threads){
    go quicksort(less, left_ch, level, threads) //分任务
    go quicksort(greater,right_ch, level, threads)
  }else{
    quicksort(less,left_ch, level, threads)
    quicksort(greater,right_ch, level, threads)
  }
  
  //合并数据
  for i := range left_ch{
    ch<-i;
  }
  ch<-left
  for i := range right_ch{
    ch<-i;
  }
  close(ch)
  return
}

func main() {
    x := []int{3, 1, 4, 1, 5, 9, 2, 6}
    ch := make(chan int)
    go quicksort(x, ch, 0, 0) // 0 0 表示不限制线程个数
    for v := range(ch) {
        fmt.Println(v)
    }
}


有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:ZHONGHUNZHAIZHUREN

查看原文:go语言写的并行排序算法(快速排序)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

4085 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传