JS歸併排序

2021-08-21 19:50:39 字數 1167 閱讀 6741

var arr = [49, 38, 65, 97, 76, 13, 27, 49];

console.log(mergesort(arr))

function merge(left, right)

return tmp.concat(left, right);

}function mergesort(a)

這段合併排序的**相當簡單直觀,但是mergesort()函式會導致很頻繁的自呼叫。乙個長度為n的陣列最終會呼叫mergesort()2*n-1次,這意味著如果需要排序的陣列長度很大會在某些棧小的瀏覽器上發生棧溢位錯誤。

console.log(mergesort([1, 3, 4, 2, 5, 0, 8, 10, 4]));

function merge(left, right)

return result.concat(left, right);

}function mergesort(a)

return work[0];

}

因為merge時比較大的值並未從陣列中刪去,雖然會被覆蓋掉,但每趟合併的最後乙個work[k+1]裡的值如果有剩餘,就會被保留下來,如果陣列長度為奇數,則在下一趟合併時就會和最後一組有序子串行一起合併,導致出現多餘的數字的錯誤。

如上圖,1和3已經合併,但由於1比3小,所以執行了merge函式裡result.push(left.shift()),而right其實是沒有進行操作的,所以work[1]裡的3還存在。

這裡合併完後,分為了3組有序子串行[1,2,3,4],[0,5,8,10],[4],但由於遺留下來的work[3]裡的[8,10],下一趟合併時會和索引為2的有序子串行[4],進行合併。

從而導致排序後多了個8和10。所以在每趟合併後加入work[j] = ,將最後一組有序子串行索引+1的資料清空。

歸併排序(JS)

歸併排序 js jane 96 2019 03 25 19 10 49 4365 收藏 1 展開歸併排序 從小到大 演算法複雜度 最好情況 o nlogn 最壞情況 o nlogn 平均情況 o nlogn 空間複雜度 o n 穩定性 穩定 function mergesort arr,start,...

js排序 歸併排序

歸併排序是乙個o nlogn 的演算法,基本思想就是乙個分治策略,先進行劃分,然後再進行合併,下面舉個例子。有這樣一組資料 如果對它進行歸併排序的話,首先將它從中間分開,這樣,它就被分成了兩個陣列 與 對這兩個陣列,也分別進行這樣的操作,逐步的劃分,直到不能再劃分為止 每個子陣列只剩下乙個元素 這樣...

Js 排序演算法 歸併排序

將兩個或兩個以上的有序序列合併成乙個有序序列過程 以二路歸併為例 穩定的排序方法 遞迴演算法 歸併排序 二路歸併 function msort record,newrecord,s,t else console.log record return newrecord function merge r...