美文网首页Go语言Go面试宝典Go
Go使用goroutine并发的快速排序

Go使用goroutine并发的快速排序

作者: 流芳不待人 | 来源:发表于2018-04-09 20:10 被阅读42次

    经典面试题:快速排序。
    一般都使用递归,但golang中利用goroutine的并发可以加快。

    func QuickSort(data []int) []int {
        if len(data) <= 1 {
            return data
        }
        var wg sync.WaitGroup
        c := data[0]
        var s1, s2 []int
    
        for k, v := range data {
            if k == 0 {
                continue
            }
            if c > v {
                s2 = append(s2, v)
            } else {
                s1 = append(s1, v)
            }
        }
    
        wg.Add(2)
        go func() {
            s1 = QuickSort(s1)
            wg.Done()
        }()
        go func() {
            s2 = QuickSort(s2)
            wg.Done()
        }()
        wg.Wait()
    
        data = []int{c}
        if len(s1) > 0 {
            data = append(s1, data...)
        }
        if len(s2) > 0 {
            data = append(data, s2...)
        }
        return data
    }
    
    func main() {
        data := []int{3, 6, 23, 7, 2, 4, 9, 13}
        fmt.Println(QuickSort(data))
    }
    
    

    相关文章

      网友评论

      • 存在的寂静:在我的mac上,你这个并发的算法比普通的算法慢了100多倍。
        流芳不待人:@存在的寂静 谢谢~受教了:grin:
        存在的寂静:@流芳不待人 并发只对有阻塞的应用有提高速度的效果,而排序明显是计算密集型的,由于并发还有同步的问题,反而会拖慢速度,我试了交换的方法,比你的快,但还是比普通的慢。
        流芳不待人:多谢提醒~~我试验了一下,10个数排序100次,普通快排能快10倍。1万个数排1万次,普通快排大概快20%。而且我这里用append也不合适,用两数交换应该会更快一些。请教一下:普通快排为什么会更快呢?

      本文标题:Go使用goroutine并发的快速排序

      本文链接:https://www.haomeiwen.com/subject/zscwhftx.html