归并排序

归并排序

这个排序算法是建立在归并操作上的一种有效的排序算法,算法主要采用分治法,归并排序的算法复杂度为O(n*logn),需要一个与数组的长度n一样的额外空间,实现归并排序通常对于一个数组我们对前半部分进行排序,然后进行后半部分进行排序,实现原地归并操作,不过需要额外的空间存储数组。归并排序分为两种,一种是自顶向下的归并排序,一种是自底向上的归并排序。

一、自顶向下的归并排序

把数组元素不断的二分,直到子数组的元素个数为一个,这时子数组必然是有序的,然后将两个有序的序列合并成一个新的有序的序列,两个新的有序序列又可以合并成另一个新的有序序列,以此类推,直到合并成一个有序的数组。


var data=[1,5,3,23,4,67,8];
function merge(data, left, center, right) {
    var tmpArr = [];
    var mid = center + 1;
    var third = left;
    var tmp = left;
    while (left <= center && mid <= right) {
        if (data[left] <= data[mid]) {
            tmpArr[third++] = data[left++];
        } else {
            tmpArr[third++] = data[mid++];
        }
    }
    while (mid <= right) {
        tmpArr[third++] = data[mid++];
    }
    while (left <= center) {
        tmpArr[third++] = data[left++];
    }
    while (tmp <= right) {
        data[tmp] = tmpArr[tmp++];
    }
}
function sort(data, left, right) {
    if (left >= right)
        return;
    var center = parseInt((left + right) / 2);
    sort(data,left,center);
    sort(data,center+1,right);
    merge(data,left,center,right);
    console.log(data);
}

sort(data,0,6);
console.log(data);

二、自底向上的归并排序

其实逻辑跟上一个一样,只有sort函数有差别,不过这个不需要递归到最后,直接从一开始就进行比较,通过控制增量解决合并的问题,如果有8个元素,增量为1时有四组合并,增量为2时候,两组合并,最后进行全部合并。

function sort2(data,left,right)
{
    var len=data.length;
    for (var sz = 1; sz < len; sz *= 2)
    {
        for (var lo = 0; lo < len; lo += 2 * sz)
        {
            merge(data, lo, lo+sz-1, min(lo+2*sz-1, len-1));
        }
    }
}
function min(m,n) {
    if(m<=n){
        return m;
    }else {
        return n;
    }
}
结果数组
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 5,030评论 0 2
  • 数据结构与算法--归并排序 归并排序 归并排序基于一种称为“归并”的简单操作。比如考试可能会分年级排名和班级排名,...
    sunhaiyu阅读 4,408评论 0 6
  • 序言 上一篇文章我们已经讲完了插入排序,也就是说我的On^2 的算法基本就写完了,当然还有别的On^2 的算法,但...
    再见远洋阅读 5,622评论 0 3
  • 归并排序 所谓归并,就是将两个或两个以上的有序表合并成一个新的有序表。如下图所示,有两个已经排好序的有序表A[1]...
    JackChen1024阅读 6,921评论 0 4
  • “人在一定的时间点 ,必须亲手结束一些东西,好让自己真正想要的来得快一些。”比如我们。
    oursky阅读 1,605评论 0 0