算法重头学-归并排序

归并排序

归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法,效率为O(n log n)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。

上一章我们大概了解了一下“插入排序”,并且使用js对插入排序进行了实现。本章紧接着谈到“归并排序”,因为这里要用到“插入排序”算法评估的最佳场景。

假设数组Array[1,N],且该数组为从小到大已正向排序的,现需将数值Value插入到该数组,当且仅当Value < Array[1]时只需要做一次比较运算即可得到插入位置,这种情况是“插入排序”的最佳场景。

代码

"use strict";
var arr = [5,2,4,6,1,3];

function sort(arr){
    let len = arr.length;
    merge(arr,0,len-1,len-1);
    console.log(arr);
}

function merge(arr,start,end){
    if(start >= end){
        return;
    }
    //以数组的中点为分界线,分别对左右2段进行排序
    let middle = Math.floor((start + end)/2);
    merge(arr,start,middle);
    merge(arr,middle + 1,end);

    let s = start,
        m = middle,
        i,
        tmp;

    /**
     * 2个已排序的数组进行合并
     * arr[s,m]为Left数组,arr[m+1,end]为Right数组
     * 利用插入排序的最优场景,将arr[m+1,end]中的
     *一次遍历结束的标志是:2个数组都为空(全部扫描)
     *
     */

    while( s <= m && m < end){
        //正向排序的最优处理方案,将一个值插入到所有值都比该数值都大的正向数组中
        if(arr[s] >= arr[m + 1]){
            tmp = arr[m + 1];
            for(i = m ; i >= s ; i--){
                arr[i + 1] = arr[i];
            }
            arr[s] = tmp;
            m++;
        }else{
            //缩小下一次检索的范围
            s++;
        }
    }
}

sort(arr);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值