排序算法(2):归并排序

 归并排序:归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法,效率为O(n log n)。

 用归并排序对n个元素的数组进行排序时,当n为2的幂时,元素比较次数在(n log n)/2到n log n - n +1之间,元素被赋值次数为2n log n。时间复杂度O(n log 2n),速度仅次于快排,比较稳定。

 该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。

 归并排序的核心思想是将两个有序的数列合并成一个大的有序的序列。通过递归,层层合并,即为归并。

merge2.png
合并相邻有序子序列

 再来看看治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],来看下实现步骤。


merge3.png
代码实现:
package sort

func MergeSort(array []int, left, right int, temp []int) {
    if left < right {
        mid := (left + right) / 2
        MergeSort(array, left, mid, temp)
        MergeSort(array, mid+1, right, temp)
        Merge(array, left, mid, right, temp)
    }
}

func Merge(array []int, left, mid, right int, temp []int) []int {
    leftStart := left
    rightStart := mid + 1
    i := 0
    for {
        if leftStart >= mid || rightStart >= right {
            break
        }
        if array[leftStart] <= array[rightStart] {
            temp[i] = array[leftStart]
            leftStart++
        } else {
            temp[i] = array[rightStart]
            rightStart++
        }
        i++

    }

    for {
        if leftStart < mid {
            temp[i] = array[leftStart]
        }
        leftStart++
        i++
    }

    for {
        if rightStart < right {
            temp[i] = array[rightStart]
        }
        rightStart++
        i++
    }

    return temp
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文的最新版本位于:https://github.com/iwhales/algorithms_notes转载请注...
    import_hello阅读 1,478评论 1 17
  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 6,146评论 0 13
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,250评论 0 52
  • 昨晚熬夜看完了《请回答1988》,心情闷闷的,有些话有些情绪梗在喉咙里,说不出来又咽不下去。 一直看...
    猴哥是个小胖囝阅读 218评论 0 0