美文网首页
算法(三)--归并排序

算法(三)--归并排序

作者: yu580 | 来源:发表于2018-03-20 14:28 被阅读0次

归并算法思想

1.申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
2.设定两个指针,最初位置分别为两个已经排序序列的起始位置
3.比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
4.重复步骤3直到某一指针超出序列尾将另一序列剩下的所有元素直接复制到合并序列尾
图示如下:

image

根据图示代码如下:

 /**
 * 归并排序   递归方式
 * @param {* 需要排序的数组} arr 
 * @param {* 数组长度} n 
 */
this.mergeSort = (arr, n) => {
    var _this = this
    //传入n-1是保证 数组 arr 是[l,mid][mid+1,r]是两个保单左右端的闭区间
    __mergeSort(arr, 0, n - 1)
    //归并两个闭区间
    function __merge(arr, l, mid, r) {
        let result = arr;
        let i = l, j = mid + 1;
        for (let k = l; k <= r; k++) {
            if (i > mid) {
                arr[k] = result[j - l]
                j++
            } else if (j > r) {
                arr[k] = result[i - l]
                i++
            } else if (arr[i - l] < arr[j - l]) {
                arr[k] = result[i - l]
                i++
            } else {
                arr[k] = result[j - l]
                j++
            }
        }
    }
    //递归分解
    function __mergeSort(arr, l, r) {
        if (l >= r) {
            return
        }
        //尝试优化  存在bug
        // if (r - l <= 2) {
        //     _this.insertionSort2(arr, l, r)
        //     return
        // }

        //l+r可能超出计算机的最大数值
        let mid = Math.floor((l + r) / 2)
        __mergeSort(arr, l, mid)
        __mergeSort(arr, mid + 1, r)
        //对于近乎有序数组的排序优化
        //因为每一次__merge都会保证 l到mid是有序的  mid到 r是有序的
        if (arr[mid] > arr[mid + 1]) {
            __merge(arr, l, mid, r)
        }
    }
}

代码解析

__mergeSort函数递归分解需要排序的数组,当L>=r时停止递归。
__merge归并两个闭区间,将两个有序的数组合并成一个。

下面介绍另外一种归并排序,使用迭代的方式,或者说自底向上的方式。

/**
 * 归并排序   自底向上
 * 相比较于是比递归方式要慢一点   可以很好的对链表数据结构排序nlogon级别的排序
 * @param {* 需要排序的数组} arr 
 * @param {* 数组长度} n 
 */
this.mergeSortBu = (arr, n) => {
    for (let size = 1; size < n; size += size) {
        for (let i = 0; i + size < n; i += size + size) {
            let max = i + size + size - 1 > n - 1 ? n - 1 : i + size + size - 1
            //排序优化
            if (arr[i + size - 1] > arr[i + size]) {
                //对 [i,i+size-1]和[i+size,i+size+size-1]进行归并
                __merge(arr, i, i + size - 1, max)
            }
        }

    }

    function __merge(arr, l, mid, r) {
        let result = arr;
        let i = l, j = mid + 1;
        for (let k = l; k <= r; k++) {
            if (i > mid) {
                arr[k] = result[j - l]
                j++
            } else if (j > r) {
                arr[k] = result[i - l]
                i++
            } else if (arr[i - l] < arr[j - l]) {
                arr[k] = result[i - l]
                i++
            } else {
                arr[k] = result[j - l]
                j++
            }
        }
    }
}

图示如下:


归并排序.png

将数组分成数组长度分,从下往上进行合并。每一次size*2.这样做我觉得的可能好理解一点。

以上都是个人理解如有不对之处还望指正交流!

相关文章

  • 2018-06-30

    排序算法之归并排序 归并排序算法是排序算法中的经典算法之一,其核心思想是利用归并的思想实现的排序方法,该算法采用经...

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

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

  • java实现快速排序、归并排序、希尔排序、基数排序算法...

    快速排序算法 归并排序算法 希尔排序算法 基数排序算法

  • 排序算法之归并排序

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

  • 归并排序

    图解排序算法(四)之归并排序 基本思想 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用...

  • 归并排序

    归并排序 这个排序算法是建立在归并操作上的一种有效的排序算法,算法主要采用分治法,归并排序的算法复杂度为O(n*l...

  • 第三章:高级排序算法

    归并排序算法(mergeSort) 算法思想:Python使用函数实现: 自底向上的归并排序算法 算法思想:Pyt...

  • 算法入门——归并排序、希尔排序

    上篇文章我们学习了算法入门——堆排序,这篇文章我们学习算法入门——归并排序、希尔排序。 归并排序 归并排序是将一个...

  • 归并算法

    归并排序(Merge sort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。归并算法的中心是归并两...

  • web开发需要知道的几个算法

    算法分类 快速排序算法 深度优先算法 广度优先算法 堆排序算法 归并排序算法

网友评论

      本文标题:算法(三)--归并排序

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