歸併排序是能夠被實際使用的排序算法,其複雜度爲O(nlogn)。算法
思路:歸併排序是一種分治算法。其思想是將原始數組切分爲較小的數組,知道每一個小數組只有一個位置。接着將小數組歸併爲較大的數組,直到最後只有一個排序完畢的大數組。數組
因爲是分治法,歸併排序也是遞歸的;咱們首先定義一個實際被執行的輔助函數。函數
// 該函數是將一個數組切分爲兩個數組 function mergeSort(array){ var length = array.length; // 當length爲1時,說明已經切割爲最小數據,遞歸的結束條件 if(length == 1){ return array; } var mid = Math.floor(length / 2), left = array.slice(0,mid), right = array.slice(mid,length);
// merge函數,負責將分割的小數組合並
return merge(mergeSort(left), mergeSort(right)) }
function merge(left, right){ var result = [], il = 0, ir = 0; // 這裏的left 和 right 分被是兩個已經排過序的數組 // 選擇兩個數組中最小的依次放入結果中,直到一個數組的值徹底放進結果集中 // 直到其中的一個數組所有放到結果集中,結束循環 while(il < left.length && ir < right.length){ if(left[il] < right[ir]){ result.push(left[il++]) }else{ result.push(right[ir++]) } } //將尚未徹底放進去的那個數組,依次放入結果集,由於每一個數組必定是已經排好序的 // 這裏的left 與 right 不分前後 由於到這裏確定有一個數組爲空, while(il < left.length){ result.push(left[il++]) } while(ir < right.length){ result.push(right[ir++]) } return result; }
主要流程:spa
算法首先將原始數組分割直至只有一個元素的子數組,而後開始歸併。歸併過程也會完成排序,直至原始數組徹底合併並完成排序。code
圖示:blog