Javascript算法——歸併排序

常見的內部排序算法有:插入排序、希爾排序選擇排序、冒泡排序、歸併排序、快速排序、堆排序、基數排序等。這裏主要介紹歸併排序算法

一圖勝千言:segmentfault

圖片描述

1.歸併排序

1.1 算法描述

歸併排序是創建在歸併操做上的一種有效的排序算法。該算法是採用分治法(Divide and Conquer)的一個典型的應用。 合併排序法是將兩個(或兩個以上)有序表合併成一個新的有序表,即把待排序序列分爲若干個子序列,每一個子序列是有序的。而後再把有序子序列合併爲總體有序序列。 將已有序的子序列合併,獲得徹底有序的序列;即先使每一個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱爲2-路歸併。數組

圖片描述

1.2 算法分析

  • 時間複雜度:O (nlogn)ide

  • 空間複雜度:O (n)spa

1.3 算法實現

function merge(leftArr, rightArr){  
    var result = [];  
    while (leftArr.length > 0 && rightArr.length > 0){  
      if (leftArr[0] < rightArr[0])  
        result.push(leftArr.shift()); //把最小的最早取出,放到結果集中   
      else   
        result.push(rightArr.shift());  
    }   
    return result.concat(leftArr).concat(rightArr);  //剩下的就是合併,這樣就排好序了  
}  

function mergeSort(array){  
    if (array.length == 1) return array;  
    var middle = Math.floor(array.length / 2);       //求出中點  
    var left = array.slice(0, middle);               //分割數組  
    var right = array.slice(middle);  
    return merge(mergeSort(left), mergeSort(right)); //遞歸合併與排序  
}  

var arr = mergeSort([32,12,56,78,76,45,36]);
console.log(arr);   // [12, 32, 36, 45, 56, 76, 78]
相關文章
相關標籤/搜索