归并排序算法分析_八种基本排序及其时间复杂度

(3) 2024-07-22 20:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
归并排序算法分析_八种基本排序及其时间复杂度,希望能够帮助你!!!。

十大经典排序算法
  • 十大经典排序算法-冒泡排序算法详解
  • 十大经典排序算法-选择排序算法详解
  • 十大经典排序算法-插入排序算法详解
  • 十大经典排序算法-希尔排序算法详解
  • 十大经典排序算法-快速排序算法详解
  • 十大经典排序算法-归并排序算法详解
  • 十大经典排序算法-堆排序算法详解
  • 十大经典排序算法-计数排序算法详解
  • 十大经典排序算法-桶排序算法详解
  • 十大经典排序算法-基数排序算法详解

一、什么是归并排序

1.概念

归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法,归并排序对序列的元素进行逐层折半分组,然后从最小分组开始比较排序,合并成一个大的分组,逐层进行,最终所有的元素都是有序的

2.算法原理

这是一个无序数列:4、5、8、1、7、2、6、3,我们要将它按从小到大排序。按照归并排序的思想,我们要把序列逐层进行拆分
归并排序算法分析_八种基本排序及其时间复杂度_https://bianchenghao6.com/blog__第1张
序列逐层拆分如下
归并排序算法分析_八种基本排序及其时间复杂度_https://bianchenghao6.com/blog__第2张
然后从下往上逐层合并,首先对第一层序列1(只包含元素4)和序列2(只包含元素5)进行合并

创建一个大序列,序列长度为两个小序列长度之和,p1、p2指针分别指向两个小序列的第一个元素,p指向大序列的第一个元素
归并排序算法分析_八种基本排序及其时间复杂度_https://bianchenghao6.com/blog__第3张
比较p1、p2指向的元素,4小于5,将4填入p指向的元素,p、p1往右移一位
归并排序算法分析_八种基本排序及其时间复杂度_https://bianchenghao6.com/blog__第4张
此时,序列1已经没有元素,将序列2的元素依次填入大序列中
归并排序算法分析_八种基本排序及其时间复杂度_https://bianchenghao6.com/blog__第5张
序列8和1,序列7和2,序列6和3,用同样的方式填入新的序列
归并排序算法分析_八种基本排序及其时间复杂度_https://bianchenghao6.com/blog__第6张
接着,以4、5为序列1,1、8为序列2,继续进行合并

创建一个序列长度为4的大序列,p1指向序列1的第一个元素4,p2指向序列2的第一个元素1,p指向大序列的第一个元素
归并排序算法分析_八种基本排序及其时间复杂度_https://bianchenghao6.com/blog__第7张
4和1比较,4大于1,1填入p指向的元素,p、p2往右移一位
归并排序算法分析_八种基本排序及其时间复杂度_https://bianchenghao6.com/blog__第8张
4和8比较,4小于8,4填入p指向的元素,p、p1往右移一位
归并排序算法分析_八种基本排序及其时间复杂度_https://bianchenghao6.com/blog__第9张
5和8比较,5小于8,5填入p指向的元素,p、p1往右移一位
归并排序算法分析_八种基本排序及其时间复杂度_https://bianchenghao6.com/blog__第10张
自此,序列1已经没有元素,将序列2的元素依次填入大序列中
归并排序算法分析_八种基本排序及其时间复杂度_https://bianchenghao6.com/blog__第11张
序列2、7和序列3、6以同样的方式合并成新的序列
归并排序算法分析_八种基本排序及其时间复杂度_https://bianchenghao6.com/blog__第12张
最后,将序列1、4、5、8和序列2、3、6、7以同样的方式继续合并成新的序列
归并排序算法分析_八种基本排序及其时间复杂度_https://bianchenghao6.com/blog__第13张
至此所有的元素都是有序的

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.cn/

还可以输入表达式进行内容选取,对于复杂json非常多层级的内容展现非常用用处
归并排序算法分析_八种基本排序及其时间复杂度_https://bianchenghao6.com/blog__第14张

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

上一篇

已是最后文章

下一篇

已是最新文章

发表回复