通过WaitGroup编排递归快速排序调用

时间:2017-07-20 19:05:28

标签: recursion go concurrency synchronization quicksort

我正在尝试并行运行递归quicksort调用:

func quicksort(a []int) {
    quicksortRecursive(a)
    wg.Wait()
    insertionsort(a)
}

func quicksortRecursive(a []int) {
    if len(a) > THRESHOLD {
        l, r := partition(a)
        wg.Add(2)
        go func() {
            quicksortRecursive(a[:r+1])
            wg.Done()
        }()
        go func() {
            go quicksortRecursive(a[l:])
            wg.Done()
        }()
    }
}

go来电显得过于笨拙。以下是更可读的版本仍然正确吗?

func quicksort(a []int) {
    wg.Add(1)
    quicksortRecursive(a)
    wg.Wait()
    insertionsort(a)
}

func quicksortRecursive(a []int) {
    if len(a) > THRESHOLD {
        l, r := partition(a)
        wg.Add(2)
        go quicksortRecursive(a[:r+1])
        go quicksortRecursive(a[l:])
    }
    wg.Done()
}

我特别想知道在同一个帖子中调用初始wg.Add(1)和相应的wg.Done()是否是犹太洁食。

1 个答案:

答案 0 :(得分:2)

如果它正常工作,那么它是正确的。在代码质量方面,除了对WaitGroup使用全局变量的轻微担忧外,我认为该方法没有任何问题。如果它是一个小应用程序它可能没问题,否则我会使用在quicksort中创建的局部变量并作为参数传递给quicksortRecursive