美文网首页
归并排序,自顶向下与自底向上两种方式(golang实现)

归并排序,自顶向下与自底向上两种方式(golang实现)

作者: imroc | 来源:发表于2017-09-03 14:34 被阅读0次

封装成函数:

//自顶向下归并排序
func MergeSortUpToDown(s []int) {
    aux := make([]int, len(s)) //辅助切片
    mergeSortUpToDown(s, aux, 0, len(s)-1)
}
 
//自底向上归并排序
func MergeSortDownToUp(s []int) {
    aux := make([]int, len(s)) //辅助切片
    n := len(s)
    for sz := 1; sz < n; sz *= 2 {
        for lo := 0; lo < n-sz; lo += 2 * sz {
            merge(s, aux, lo, lo+sz-1, min(lo+2*sz-1, n-1))
        }
    }
}
 
func mergeSortUpToDown(s, aux []int, lo, hi int) {
    if lo >= hi {
        return
    }
    mid := (lo + hi) >> 1
    mergeSortUpToDown(s, aux, lo, mid)
    mergeSortUpToDown(s, aux, mid+1, hi)
    merge(s, aux, lo, mid, hi)
}
 
//归并操作
func merge(s, aux []int, lo, mid, hi int) {
    for k := lo; k <= hi; k++ {
        aux[k] = s[k]
    }
    i, j := lo, mid+1
    for k := lo; k <= hi; k++ {
        if i > mid {
            s[k] = aux[j]
            j++
        } else if j > hi {
            s[k] = aux[i]
            i++
        } else if aux[j] < aux[i] {
            s[k] = aux[j]
            j++
        } else {
            s[k] = aux[i]
            i++
        }
    }
}
 
func min(i, j int) int {
    if j < i {
        return j
    }
    return i
}

测试:

s := []int{9,0,6,5,8,2,1,7,4,3}
fmt.Println(s)
MergeSortUpToDown(s)
//MergeSortDownToUp(s)
fmt.Println(s)

输出:
[9 0 6 5 8 2 1 7 4 3]
[0 1 2 3 4 5 6 7 8 9]

相关文章

  • c算法O(n*log n)(二)

    归并排序Merge Sort 自顶向下进行排序 自底向上进行归并排序 快速排序

  • Java版归并排序算法实现

    merge函数的实现 递归方式实现(自顶向下)的归并排序算法 借用栈实现循环方式(自顶向下)的归并排序算法 不借用...

  • 排序算法

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

  • 归并排序,自顶向下与自底向上两种方式(golang实现)

    封装成函数: 测试: 输出:[9 0 6 5 8 2 1 7 4 3][0 1 2 3 4 5 6 7 8 9]

  • 5.归并排序

    5.归并排序 5.1归并排序的思想和复杂度 归并排序思想 归并排序主要是分治法的思想,有自顶向下和自底向上的归并排...

  • 排序算法学习笔记(nlogn部分)

    归并排序 自顶向下进行归并排序(方法1) 注意:1.对于已经有序的数组,插入排序的效率要高于归并排序 自底向上的归...

  • 排序算法总结

    选择排序法 插入排序法 冒泡排序法 归并排序法 自顶向下 自底向上 快速排序法 单路快速排序法 双路快速排序法 三...

  • 归并排序,自顶向下与自底向上两种方式(Java实现)

    封装成类: 测试: 输出:[9, 0, 6, 5, 8, 2, 1, 7, 4, 3][0, 1, 2, 3, 4...

  • 归并排序精讲——分治算法的初步应用

    归并排序,是一种使用分治策略的算法,主要分为两种,一种是自顶向下,一种是自底向上。这两种排序一般都是使用递归方法实...

  • 归并排序

    归并排序将一个数组递归地分成两半分别排序,然后将结果归并起来。 自顶向下归并排序 自顶向下归并排序 结论 对于长度...

网友评论

      本文标题:归并排序,自顶向下与自底向上两种方式(golang实现)

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