这里是传送门⇒总结:关于排序算法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)