zoukankan      html  css  js  c++  java
  • 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)
    	}
    }
    

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

  • 相关阅读:
    2019.8.16
    一种抠环的办法
    [HAOI2015]树上染色
    有关树形背包
    2019.7.27
    有关矩阵快速幂
    2019.7.25
    欧拉函数(转载)
    2019.7.22
    phpstudy集成环境安装redis扩展
  • 原文地址:https://www.cnblogs.com/c1024/p/11011993.html
Copyright © 2011-2022 走看看