十大经典排序算法
- 十大经典排序算法-冒泡排序算法详解
- 十大经典排序算法-选择排序算法详解
- 十大经典排序算法-插入排序算法详解
- 十大经典排序算法-希尔排序算法详解
- 十大经典排序算法-快速排序算法详解
- 十大经典排序算法-归并排序算法详解
- 十大经典排序算法-堆排序算法详解
- 十大经典排序算法-计数排序算法详解
- 十大经典排序算法-桶排序算法详解
- 十大经典排序算法-基数排序算法详解
一、什么是归并排序
1.概念
归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法,归并排序对序列的元素进行逐层折半分组,然后从最小分组开始比较排序,合并成一个大的分组,逐层进行,最终所有的元素都是有序的
2.算法原理
3.算法实现
function sort(arr, startIndex = 0, endIndex = arr.length - 1) { // 递归结束条件:startIndex大于等于endIndex的时候 if (startIndex >= endIndex) { return; } // 折半递归 let midIndex = parseInt((startIndex + endIndex) / 2); sort(arr, startIndex, midIndex); sort(arr, midIndex + 1, endIndex); // 将两个有序的小数组,合并成一个大数组 merge(arr, startIndex, midIndex, endIndex); } function merge(arr, startIndex, midIndex, endIndex) { // 新建一个大数组 let tempArr = []; let p1 = startIndex; let p2 = midIndex + 1; let p = 0; // 比较两个有序小数组的元素,依次放入大数组中 while (p1 <= midIndex && p2 <= endIndex) { if (arr[p1] <= arr[p2]) { tempArr[p++] = arr[p1++]; } else { tempArr[p++] = arr[p2++]; } } // 右侧小数组已排序完毕,左侧小数组还有剩余,将左侧小数组元素依次放入大数组尾部 while (p1 <= midIndex) { tempArr[p++] = arr[p1++]; } // 左侧小数组已排序完毕,右侧小数组还有剩余,将右侧小数组元素依次放入大数组尾部 while (p2 <= endIndex) { tempArr[p++] = arr[p2++]; } for (let i = 0; i < tempArr.length; i++) { arr[i + startIndex] = tempArr[i]; } } let arr = [4, 5, 8, 1, 7, 2, 6, 3]; sort(arr); console.log(arr);
二、归并排序算法特点
1.时间复杂度
归并排序算法每次将序列折半分组,共需要logn轮,因此归并排序算法的时间复杂度是O(nlogn)
2.空间复杂度
归并排序算法排序过程中需要额外的一个序列去存储排序后的结果,所占空间是n,因此空间复杂度为O(n)
3.稳定性
归并排序算法在排序过程中,相同元素的前后顺序并没有改变,所以归并排序是一种稳定排序算法
另外推荐一个开发者小工具网站,个人觉得里面的Json格式化功能很强大,报错很详细
https://tinyutil.com/
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/202746.html原文链接:https://javaforall.net
