golang的并行快速排序

Posted 孤独风中一匹狼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang的并行快速排序相关的知识,希望对你有一定的参考价值。

1.nums[0]作为core,将nums中大于core的元素放入greater,将不大于core的元素放入less
    当nums长度为1时往ch中写入此元素
2.分别对less和greater进行1操作(并行)
3.读取2操作中写入的ch,先读less再读core最后读greater保证大小顺序


const Length = 10000

func quickSort(nums []int, ch chan int) {
    if len(nums) == 0 {
        close(ch)
        return
    }
    if len(nums) == 1 {
        ch <- nums[0]
        close(ch)
        return
    }
    less, greater := []int{}, []int{}
    core := nums[0]
    nums = nums[1:]
    for _, v := range nums {
        if v <= core {
            less = append(less, v)
        } else {
            greater = append(greater, v)
        }
    }
    leftCh, rightCh := make(chan int, len(less)), make(chan int, len(greater))
    go quickSort(less, leftCh)
    go quickSort(greater, rightCh)

    for v := range leftCh {
        ch <- v
    }
    ch <- core
    for v := range rightCh {
        ch <- v
    }
    close(ch)
    return
}

func main() {
    nums := []int{}
    ch := make(chan int, Length)  //缓冲channel
    //var ch chan int
    fmt.Println(ch == nil)
    for i := 0; i < Length; i++ {
        nums = append(nums, rand.Int()) //初始化数组,长度Length = 10000
    }
    now := time.Now()
    quickSort(nums, ch)
    fmt.Println("数组长度:", Length, " 耗时:", time.Since(now))
}

false
default
数组长度: 10000 耗时: 14.68245ms

以上是关于golang的并行快速排序的主要内容,如果未能解决你的问题,请参考以下文章

递归深度截止策略:并行快速排序

goroutine简介

golang 快速排序

2golang之快速排序

非并行样本排序是不是与快速排序具有相同的复杂性?

手撸golang 基本数据结构与算法 快速排序