js排序算法04——归并排序

鲁小肃      2022-02-16     574

关键词:

归并排序是一种分治算法。思想是把原数组切分成较小的数组,直到每个小数组只有一个位置,再将小数组归并成较大的数组,直到最后有一个完整有序的大数组。

js实现如下:

function mergeSort(arr){
    if(arr.length==1){
        return arr;       //长度为1直接返回
    }
    else if(arr.length==2){
        var ar0=arr[0];
        var ar1=arr[1];
            arr[0]=ar0<=ar1?ar0:ar1;
            arr[1]=ar0>ar1?ar0:ar1;         //长度为2,返回排好序的数组
    }
    else{
        var mid = Math.floor(arr.length/2);
        var left=mergeSort(arr.slice(0,mid));
        var right=mergeSort(arr.slice(mid,arr.length));    //递归
        var result=[];
        var il=0;
        var ir=0;
        while(il<left.length&&ir<right.length){
            if(left[il]<=right[ir]){
                result.push(left[il++]);
            }
            else{
                result.push(right[ir++]);
            }
        }                       //合并
        while(il<left.length){
            result.push(left[il++]);
        }                       //左边的数组未拍完,直接添加在数组末尾
        while(ir<right.length){
            result.push(right[ir++]);
        }                       //右边的数组未拍完,直接添加在数组末尾
        //以上两个至多有一个会发生
        return result;  
    }
}

归并排序是一种稳定排序,无论最好情况和最坏情况时间复杂度为O(nlogn),空间复杂度为O(n)。

附:T(n)=2T(n/2)+cn;

T(n)=4T(n/4)+2cn;

T(n)=8T(n/8)+3cn;

n=2^k;

k=logn;

T(n)=2^kT(n/2^k)+kcn;

T(n)=nT(1)+cnlog2n;

常见排序算法之归并排序——归并排序

本期为大家带来的是常见排序算法中的归并排序,在这里先分享归并排序的递归算法,包您一看就会,快来试试吧~一、归并排序1.1基本思想归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(... 查看详情

排序---归并排序

...四版)》的个人总结,如有错误,请批评指正。一、归并排序介绍  归并排序(Mergesort)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Div 查看详情

排序算法6——归并排序

归并排序(MergeSort),又称二路归并排序,是指将一个数组一分为二,对每一个子数组递归排序,最后将排好的子数组合并为一个有序数组的过程。归并排序,是“分治法”应用的完美实现。FromWikipedia:https://en.wikipedia.org/wiki/Me... 查看详情

八大排序算法之七-归并排序

归并类的排序算法归并:将两个或两个以上的有序表组合成一个新的有序表。内部排序中,通常采用的是2-路归并排序。即:将两个位置相邻的记录有序子序列归并为一个记录有序的序列。归并排序是建立在归并操作上的一种有... 查看详情

排序算法归并排序

...题,然后再合并这些子问题的解来建立原问题的解。归并排序操作分解:将待排序的包含n个元素的序列分解为各含n/2个元素的子序列解决:使用归并排序递归的排序两个子序列合并:合并两个子序列以产生已排序的答案归并排... 查看详情

[算法]——归并排序(mergesort)

归并排序(MergeSort)与快速排序思想类似:将待排序数据分成两部分,继续将两个子部分进行递归的归并排序;然后将已经有序的两个子部分进行合并,最终完成排序。其时间复杂度与快速排序均为O(nlogn),但是归并排序除了递... 查看详情

算法:归并排序

算法:归并排序写在前面  归并排序算法是基于一个简单的归并操作:合并两个有序数组来形成一个更大的有序数组。  提炼归并的思想,归并排序就是将一个无序数组先划分成两个部分(递归地),对其分别排序,然后再进... 查看详情

算法排序归并排序

正文之前归并排序(Mergesort),是建立在归并操作上的一种有效的排序算法,效率为O(nlogn),1945年由约翰冯诺依曼首次提出,该算法是采用分治法的一个非常典型的应用,且各层分治递归可以同时进行。????????????????????????——Wikiped... 查看详情

排序算法之归并排序(java)(代码片段)

通过Java实现归并排序归并排序介绍归并排序是建立在归并操作上的一种有效、稳定的排序算法,该算法是采用分治法的一个非常典型的应用。归并算法的主要步骤将待排序的序列分成两个子序列将子序列合并并排序重复一二... 查看详情

归并排序算法

归并排序讲解(经典):http://blog.csdn.net/jianyuerensheng/article/details/51262984http://blog.51cto.com/flyingcat2013/1281026归并排序:归并排序是基于一种被称为“分治”(divideandconquer)的策略。归并排序就是利用归并的思想实现的排序方法。而且... 查看详情

排序算法中——归并排序和快速排序(代码片段)

冒泡排序、插入排序、选择排序这三种算法的时间复杂度都为$O(n^2)$,只适合小规模的数据。今天,我们来认识两种时间复杂度为$O(nlogn)$的排序算法——归并排序(MergeSort)和快速排序(QuickSort),他们都用到了分治思想,非常... 查看详情

看动画学算法之:排序-归并排序(代码片段)

目录简介归并排序的例子归并排序算法思想归并排序的java实现归并排序的时间复杂度简介归并排序简称Mergesort是一种递归思想的排序算法。这个算法的思路就是将要排序的数组分成很多小的部分,直到这些小的部分都是已排序... 查看详情

排序算法——归并排序

三、归并排序(MergeSort) /***归并排序的驱动程序*/voidmergeSort(vector<int>&a){vector<int>tmpArray(a.size());mergeSort(a,tmpArray,0,a.size()-1);}/***进行递归调用的内部方法*a为待排序数组*tmpArray为存放归并排序结果的数组*left为子数组... 查看详情

排序算法之归并排序(代码片段)

    前面几篇介绍的选择排序、插入排序、冒泡排序等都是非常简单非常基础的排序算法,都是用了两个for循环,时间复杂度是平方级别的。本篇介绍一个比前面稍微复杂一点的算法:归并排序。归并排序算法里面... 查看详情

排序算法

1、归并排序要将一个数组排序,可以先(递归地)将它分成2半分别进行排序,然后将结果归并起来。自顶向下的归并排序:先将数组划分2部分,分别递归调用子数组进行排序,最后将子数组归并为最终的结果。自底向上的归并... 查看详情

排序算法系列:归并排序算法(代码片段)

概述上一篇我们说了一个非常简单的排序算法——选择排序。其复杂程序完全是冒泡级的,甚至比冒泡还要简单。今天要说的是一个相对比较复杂的排序算法——归并排序。复杂的原因不仅在于归并排序分成了两个部分进行... 查看详情

排序算法——二路归并排序

二路归并排序主要运用了“分治算法”,分治算法就是将一个大的问题划分为n个规模较小而结构相似的子问题。这些子问题解决的方法都是类似的,解决掉这些小的问题之后,归并子问题的结果,就得到了“大”问题的解。二... 查看详情

递归分治算法-归并排序算法

...算法通常用到递归算法来实现,故标题为递归分治。归并排序算法归并就是将两个或两个以上的有序表合并成一个新的有序表。归并排序就是将无序的待排序的序列分解成若干个有序的子序列,并把有序子序列合并为整体有序序... 查看详情