排序算法-歸並排序
阿新 • • 發佈:2019-01-14
以及 pac space nbsp == http gin app 添加項
歸並排序
概念:歸並排序是一種分治算法。其思想是將原始數組切分成較小的數組,直到每個小數組只有一個位置,接著將小數組歸並成較大的數組,直到最後只有一個排序完畢的大數組。
代碼實現
var mergeSortRec = function (array) { var length = array.length;// {1} if (length === 1) {// {2} return array; } var mid = Math.floor(length / 2), //{3}首先得找到數組的中間位 left = array.slice(0, mid),//{4}左邊小數組 right = array.slice(mid, length);//{5}右邊小數組 return merge(mergeSortRec(left), mergeSortRec(right));// {6}調用merge函數,它負責合並和排序小數組來產生大數組,直到回到原始數組並已排序完成 } var merge = function(left, right) { var result = [], //需要聲明歸並過程要創建的新數組以及用來叠代兩個數組(left和right數組)所需的兩個變量 il = 0, ir = 0; while(il < left.length && ir < right.length) {//叠代兩個數組的過程中 if (left[il] < right[ir]) {// 我們比較來自left數組的項是否比來自right數組的項小。 result.push(left[il++]);// 將該項從left數組添加至歸並結果數組,並遞增叠代數組的控制變量 } else { result.push(right[ir++]);// 從right數組添加項並遞增相應的叠代數組的控制變量 } } while (il < left.length) { //將left數組所有剩余的項添加到歸並數組中 result.push(left[il++]); } while (ir < right.length) { // 將right數組所有剩余的項添加到歸並數組中 result.push(right[ir++]) } return result; } console.log(mergeSortRec([89,78,9,6765,80,3,6]))
舉例:[8,7,6,5,4,3,2,1]
mergeSortRec([8,7,6,5,4,3,2,1])
過程如下圖,把大數組遞歸地分成小數組,再通過小數組排好序合並成大數組。
排序算法-歸並排序