合并排序是用于对元素列表进行排序的划分和征服算法。该算法首先将未排序列表分为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)
}