美文网首页
归并排序

归并排序

作者: bocsoft | 来源:发表于2018-12-24 16:56 被阅读0次

排序分 内部排序 + 外部排序 两种, 区分在于数据量, 内部排序可以将数据全部放到内存中, 然后进行排序
常见的内部排序算法: 冒泡, 快排, 归并排序等, 其中 快排 是速度最快的不稳定排序算法,归并排序可以应用于外部排序.
归并排序时, 可以一次归并多节点达到加速的效果。

package main

import (
    "fmt"
    "sort"
)

/*
排序分 内部排序 + 外部排序 两种, 区分在于数据量, 内部排序可以将数据全部放到内存中, 然后进行排序
常见的内部排序算法: 冒泡, 快排, 归并排序等, 其中 快排 是速度最快的不稳定排序算法,归并排序可以应用于外部排序.
归并排序时, 可以一次归并多节点达到加速的效果
*/

func main() {
    //内部排序(快排)
    a := []int{8, 7, 2, 3, 0, 4, 1, 9}
    sort.Ints(a)
    fmt.Println(a)

    //time.Sleep(5 * time.Second)

    //外部排序 -> 归并排序
    c := Merge(inMemSort(arraySource(3, 6, 2, 1, 9, 10, 8)), inMemSort(arraySource(7, 4, 0, 3, 2, 8, 13)))
    for v := range c {
        fmt.Printf("%4v",v)
    }

}

func inMemSort(in <-chan int) <-chan int {
    out := make(chan int)
    go func() {
        //读入内存中
        a := []int{}
        for v := range in {
            a = append(a, v)
        }
        //sort
        sort.Ints(a)
        //output
        for _, v := range a {
            out <- v
        }
        close(out)
    }()
    return out
}
func arraySource(a ...int) <-chan int { //指定从 channel 获取数据
    out := make(chan int)
    go func() {
        for _, v := range a {
            out <- v
        }
        close(out) //数据传递完毕,关闭channel
    }()
    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 {
            //fmt.Printf("v1 %s,v2 %s",v1,v2)
            if !ok2 || (ok1 && v1 <= v2) {
                out <- v1
                v1, ok1 = <-in1
            } else {
                out <- v2
                v2, ok2 = <-in2
            }
        }
        close(out)
    }()
    return out
}

/*
输出结果为:
[0 1 2 3 4 7 8 9]
   0   1   2   2   3   3   4   6   7   8   8   9  10  13
*/

相关文章

  • 排序算法

    约定 选择排序 冒泡排序 插入排序 希尔排序 归并排序1. 归并方法2. 自顶向下归并排序3. 自底向上归并排序 ...

  • 排序二:归并、快排

    文章结构 归并排序 快速排序 源码 1. 归并排序 1.1 什么是归并排序 归并排序的思想是:将待排序的区间平分成...

  • java归并排序

    归并排序什么是归并排序:图解归并排序归并排序有两种实现方式,一是基于递归,而是基于迭代1)基于递归的归并排序: 基...

  • 算法—排序篇2

    1、归并排序(Merging Sort) 归并排序(Merging Sort): 就是利用归并的思想实现排序⽅法....

  • 常见的排序算法(2)

    要点 快速排序 归并排序 1.快速排序 2.归并排序

  • 排序算法之归并排序

    归并排序(Merge Sort) 归并排序是利用归并的思想实现排序的方式,该算法采用的是经典的分治算法 归并排序过...

  • 算法 第二章第二部分笔记

    各种排序算法的性能特点 选择排序 插入排序 希尔排序 归并排序 本地归并排序 自底向上的归并排序 快速排序 三向切...

  • 归并排序(二路归并排序)

    归并排序的思路 归并排序是通过“归并”操作完成排序的,将两个或者多个有序子表归并成一个子表。归并排序是“分治法”的...

  • 算法排序之归并排序和快速排序

    归并排序和快速排序用的都是分治的思想,用递归的编程技巧来实现.咱们先来看归并排序. 归并排序 归并排序的核心思想就...

  • 基于左闭右开的乱序数组归并排序 2020-04-24(未经允许,

    归并排序代码模板 递归形式思路:二分nums数组后对nums的归并排序 = 对左侧数组归并排序+对右侧数组归并排序...

网友评论

      本文标题:归并排序

      本文链接:https://www.haomeiwen.com/subject/pwbzkqtx.html