带你读《图解算法小抄》十四、排序(7)https://developer.aliyun.com/article/1348143?groupCode=tech_library
数组复用:
为了避免在每次递归中创建新的临时数组,我们可以事先创建一个足够大的临时数组,然后在合并过程中重复使用该数组。
// 归并排序基本实现function mergeSort(arr) { if (arr.length <= 1) { return arr; } const mid = Math.floor(arr.length / 2); const left = mergeSort(arr.slice(0, mid)); const right = mergeSort(arr.slice(mid)); return merge(left, right); } function merge(left, right) { let i = 0; let j = 0; const merged = []; while (i < left.length && j < right.length) { if (left[i] < right[j]) { merged.push(left[i]); i++; } else { merged.push(right[j]); j++; } } return merged.concat(left.slice(i)).concat(right.slice(j)); } // 归并排序优化实现function mergeSortOptimized(arr) { if (arr.length <= 16) { return insertionSort(arr); // 使用插入排序优化 } const tempArr = new Array(arr.length); // 数组复用,避免重复创建临时数组 function mergeSortHelper(arr, tempArr, left, right) { // 基本实现代码省略 // 优化合并过程 if (arr[mid] <= arr[mid + 1]) { return; // 已有序,无需合并 } // 基本实现代码省略 } // 基本实现代码省略 return arr; } // 插入排序算法function insertionSort(arr) { // 算法实现代码省略} // 示例用法const array = [5, 3, 8, 4, 2, 1, 6, 7];const sortedArray = mergeSort(array); console.log(sortedArray); // 输出: [1, 2, 3, 4, 5, 6, 7, 8]
3)复杂度
名称 |
最佳情况 |
平均情况 |
最坏情况 |
内存 |
稳定性 |
备注 |
归并排序 |
n log(n) |
n log(n) |
n log(n) |
n |
是 |
|
4)参考资料
- 维基百科
- YouTube
带你读《图解算法小抄》十四、排序(9)https://developer.aliyun.com/article/1348141?groupCode=tech_library