歸併排序(MERGE-SORT)是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法(pide andConquer)的一個非常典型的應用。將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱為二路歸併。
歸併排序是一種非常穩定的排序方法,它的時間複雜度無論是平均,最好,最壞都是NlogN。
先拆分,一直拆分到只有一個數字
#從上圖可以看出,歸併排序會將一個陣列進行兩兩拆分,一直拆分到只有一個數字的時候停止拆分。
那麼拆分的程式碼就很簡單了,就是得到一個指向中間的指標q,將陣列拆分成(start,p)和(p,end)兩個部分。
function pide(p, r){ return Math.floor( (p + r) / 2 ); }合併過程
合併的過程就如上圖所示
function merge(A, p, q, r){ const A1 = A.slice(p, q); const A2 = A.slice(q, r); // 哨兵,往A1和A2里push一个最大值,比如防止A1里的数都比较小,导致第三次遍历某个数组里没有值 A1.push(Number.MAX_SAFE_INTEGER); A2.push(Number.MAX_SAFE_INTEGER); // 循环做比较,每次取出较小的那个值 for (let i = p, j = 0, k = 0; i 主程式<h3></h3>主程式就是做遞歸重複上面的操作了<p></p><pre class="brush:php;toolbar:false"> function merge_sort(A, p = 0, r) { r = r || A.length; if (r - p === 1) { return; } const q = pide(p, r); merge_sort(A, p, q); merge_sort(A, q, r); merge(A, p, q, r); return A; }完整程式碼
function pide(p, r) { return Math.floor((p + r) / 2); } function merge(A, p, q, r) { const A1 = A.slice(p, q); const A2 = A.slice(q, r); A1.push(Number.MAX_SAFE_INTEGER); A2.push(Number.MAX_SAFE_INTEGER); for (let i = p, j = 0, k = 0; i
#
以上是JavaScript中歸併排序的介紹(程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!