這裏是傳送門⇒總結:關於排序算法html
平均時間複雜度 | 最優時間複雜度 | 最差時間複雜度 | 空間複雜度 | 穩定性 | |
---|---|---|---|---|---|
二路歸併排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(n) | 穩定 |
歸併排序採用分治策略,先劃分,再合併。若排序中每次合併的時候是2個有序子序列合併,稱「二路歸併排序」。這裏討論的就是「二路歸併排序」的遞歸作法(好像遞歸可能爆棧,若是能夠,建議研究下非遞歸作法)算法
// 此處傳入的array會被直接改變 function Merge(array, left, mid, right) { var i = left; var j = mid + 1; var k = 0; var temp = []; while (i <= mid && j <= right) { if (array[i] <= array[j]) { temp[k++] = array[i++]; } else { temp[k++] = array[j++]; } } while (i <= mid) { temp[k++] = array[i++]; } while (j <= right) { temp[k++] = array[j++]; } while (k > 0) { array[--j] = temp[--k]; } } // 此處傳入的array會被直接改變 function MergeSort(array, left, right) { if (left < right) { var mid = Math.floor((left + right) / 2); MergeSort(array, left, mid); MergeSort(array, mid + 1, right); Merge(array, left, mid, right); } }
Merge
函數中,合併2個子序列時,須要藉助額外的存儲空間。每次合併過程當中都須要申請額外的內存空間,可是合併完成後,臨時開闢的內存空間就被釋放掉了,在任意時刻,只會有一個Merge
函數在執行,也就只會有一個臨時的內存空間在使用。臨時空間再大也不會超過n個數據的大小,因此空間複雜度是O(n)