并发合并使用golang中的通道和goroutines排序
#初学者 #go #并发性 #golan

合并排序是用于对元素列表进行排序的划分和征服算法。该算法首先将未排序列表分为n个sublist,每个列表包含一个元素。然后,将以结果列表的方式合并订书片。合并过程涉及比较标准板的要素并按照正确的顺序排列它们。合并排序的时间复杂性为o(n log n),使其成为大列表的有效排序算法。
使用通道和GOROUTINE在GO中使用并发合并排序优化排序。

func Mergech(left chan int, right chan int, c chan int) {
    defer close(c)
    val, ok := <-left
    val2, ok2 := <-right
    for ok && ok2 {
        if val < val2 {
            c <- val
            val, ok = <-left
        } else {
            c <- val2
            val2, ok2 = <-right
        }
    }
    for ok {
        c <- val
        val, ok = <-left
    }
    for ok2 {
        c <- val2
        val2, ok2 = <-right
    }
}
func MergeSort(arr []int, ch chan int) {
    if len(arr) < 2 {
        ch <- arr[0]
        defer close(ch)
        return
    }
    left := make(chan int)
    right := make(chan int)
    go MergeSort(arr[len(arr)/2:], left)
    go MergeSort(arr[:len(arr)/2], right)
    go Mergech(left, right, ch)
}
func main() {
    a := []int{5,4,3,2,1}
    c := make(chan int)
    var wg sync.WaitGroup
    wg.Add(1)
    go func() {
        defer wg.Done()
        mergeSort(a, c)
    }()
    wg.Wait()
    var s []int
    for v := range c {
        s = append(s, v)
    }
    fmt.Println(s)
}