Golang写的并行排序算法

时间:2022-05-04
本文章向大家介绍Golang写的并行排序算法,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
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)

    }

}