1. 程式人生 > >歸並排序算法及其JS實現

歸並排序算法及其JS實現

-a () 我們 一個 turn style mergesort 最終 二叉樹

歸並排序(MERGE-SORT)是利用歸並的思想實現的排序方法,該算法采用經典的分治(divide-and-conquer)策略(分治法將問題(divide)成一些小的問題然後遞歸求解,而治(conquer)的階段則將分的階段得到的各答案"修補"在一起,即分而治之)。

技術分享圖片

可以看到這種結構很像一棵完全二叉樹,本文的歸並排序我們采用遞歸去實現(也可采用叠代的方式去實現)。階段可以理解為就是遞歸拆分子序列的過程,對數列每次都進行切分,直到不能再切分 ,遞歸深度為log2n。

再來看看階段,我們需要將兩個已經有序的子序列合並成一個有序序列,比如上圖中的最後一次合並,要將[4,5,7,8]和[1,2,3,6]兩個已經有序的子序列,合並為最終序列[1,2,3,4,5,6,7,8],來看下實現步驟。

技術分享圖片

技術分享圖片

js代碼實現

        let dat=[5, 8, 10, 3, 2, 18, 17, 9];
        function merge(left,right){
            var temp=[];
            while(left.length&&right.length){
                if(left[0]<right[0]){
                    temp.push(left.shift());
                }else{
                    temp.push(right.shift());
                }
            }
            
//left和right長度不一樣時,直接連接剩下的長的部分(本身有序) return temp.concat(left,right); } function mergeSort(data){ if(data.length<=1){ return data; } var mid=Math.floor(data.length/2); var left=data.slice(0,mid); var
right=data.slice(mid); return merge(mergeSort(left),mergeSort(right)); } var sortedData=mergeSort(dat); console.log(sortedData);

歸並排序算法及其JS實現