Go基于协程的归并排序简单实现

归并排序这个可能很多人都不知道,今天用Go语言简单的实现下,其他语言可能要基于线程来实现。

//产生一个源
func ArraySource(a ...int) chan int{
	out :=make(chan int)
	go func(){
		for _,v:=range a{
			out <- v
		}
		close(out)
	}()
	return out
}

//进行排序
func InMemSort(in <- chan int) <-chan int {
	out := make(chan int)
	go func(){
		var a []int
		for v:=range in{
			a = append(a,v)
		}
		sort.Ints(a)
		for _,v := range a{
			out <- v
		}
		close(out)
	}()
	return out
}

//合并
func Merge(in1,in2 <- chan int) <-chan int{
	out := make(chan int)
	go func(){
		v1,ok1 := <- in1
		v2,ok2 := <- in2
		for ok1 || ok2 {
			if !ok2 || (ok1 && v1 <= v2){
				out <- v1
				v1,ok1 = <- in1
			}else{
				out <- v2
				v2,ok2 = <- in2
			}
		}
		close(out)
	}()
	return out

}


/**
归并排序
 */
func main(){
	p := Merge(InMemSort(ArraySource(23,22)),InMemSort(ArraySource(27,100,200,23,1,22)))
	for v := range p{
		fmt.Println(v)
	}
}

有问题可以在下面评论,技术问题可以私聊我

posted @ 2019-06-04 14:05  坐看云起时_雨宣  阅读(251)  评论(0编辑  收藏  举报