当前位置:首页 > 算法 > 正文内容

【算法】归并排序

一、基本思想

归并排序的核心思想是将两个已经有序的子序列合并成一个有序序列。整个过程分为两个主要步骤:


 1.分解:将待排序的序列不断二分,直到每个子序列只包含一个元素(此时自然有序) 

 2.合并:将两个有序的子序列合并为一个有序序列


注意1:若将两个有序表合并成一个有序表,称为2-路归并。

注意2:归并排序则类似于二叉树的后序遍历:它会持续划分区间,直到区间内元素有序,然后利用额外空间对元素进行排序,并将它们合并回原区间,直至整个序列有序。这个过程中,划分区间相当于达到树的最底层,而归并排序则相当于从树的底层开始向上遍历。

二、算法步骤

1.分解阶段:

  • 将长度为n的序列分成两个长度为n/2的子序列

  • 递归地对这两个子序列进行归并排序

  • 直到子序列长度为1(此时已经有序)

2.合并阶段:

  • 申请空间,大小为两个已排序子序列之和

  • 设定两个指针,分别指向两个子序列的起始位置

  • 比较两个指针所指的元素,选择较小的放入合并空间,并移动指针到下一位置

  • 重复上一步直到某一指针超出子序列范围

  • 将另一子序列的剩余元素直接复制到合并序列的末尾



动图如下:


三、时间复杂度

  • 最优情况:O(n log n)

  • 最坏情况:O(n log n)

  • 平均情况:O(n log n)

归并排序的时间复杂度始终是O(n log n),因为它总是将序列分成两半,需要进行log₂n次分解,每次合并操作的时间复杂度为O(n)。


四、空间复杂度

归并排序需要额外的空间来存储临时合并的数组,因此其空间复杂度为O(n)。


五、稳定性

归并排序是稳定的排序算法,因为在合并过程中,当两个元素相等时,可以保证左边的元素先被放入结果数组中。



六、优缺点


优点:


  • 时间复杂度稳定为O(n log n)

  • 适用于大规模数据排序

  • 稳定排序算法


缺点:


  • 需要额外的存储空间(非原地排序)

  • 对于小规模数据排序效率可能不如简单排序算法


【参考代码】

// s - 当前子序列的起始下标
// t - 当前子序列的结束下标
//a[]:待排序的原始数组(全局变量)
//r[]:临时数组,用于合并时存储中间结果(全局变量)
void msort(int s,int t){
	// 递归终止条件:当子序列只有一个元素时直接返回 
	if(s==t)
		return;
	int mid =(s+t)/2;
	msort(s,mid);  //分解左序列 
	msort(mid+1,t); //分解右序列
	
	int i=s;// 左序列起始指针
    int j = mid + 1; // 右序列起始指针
    int k = s;      // 临时数组的指针
	// 比较两个子序列的元素,按顺序放入临时数组
	while(i<=mid && j<=t){
        if(a[i] < a[j]) {  // 左序列元素较小
            r[k] = a[i];   // 放入临时数组
			k++;
			i++; 
        } else {           // 右序列元素较小
            r[k] = a[j];   // 放入临时数组
			k++;
			j++;
		}
	} 
    // 处理左序列剩余元素(如果有)
	while(i<=mid){
		r[k]=a[i];
		k++;
		i++;
	} 
    // 处理右序列剩余元素(如果有)
	while(j<=t){
		r[k]=a[j];
		k++;
		j++;
	} 
	// 将排序好的临时数组复制回原数组
	for(int i=s;i<=t;i++){
		a[i]=r[i];
	}
	
}






扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:
返回列表

上一篇:【算法】博弈论——取石子游戏

没有最新的文章了...

相关文章

【算法】单调栈

一、单调栈单调栈(Monotonic Stack)是一种特殊的栈结构,其核心思想是维护栈内元素的单调性(单调递增或单调递减)。单调栈通常用于解决与元素大小关系相关的问题,例如:找到数组中每个元素的下一...

【贪心】----找零钱问题

一、找零钱问题例题1:有 1 元,5元,10元,20元,100元,200元的钞票无穷多张。现在使用这些钞票支付X元,最少需要多少张钞票。X = 628最佳支付方法:3张200块的,1张20块的,1张5...

【排序】----插入排序

【排序】----插入排序

1.基本思想在要排序的一组数中,假定前n-1个数已经排好序,现在将第n个数插到前面的有序数列中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。2.过程·(1)从第一个元素开始,该元素可以...

【算法】博弈论——取石子游戏

【题目描述】有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取...

【算法】动态规划(二)——数字三角形问题

【算法】动态规划(二)——数字三角形问题

1.问题描述及状态定义数字三角形问题:有一个非负整数组成的三角形,第一行只有一个数,除了最下行之外每个数字的坐下方和右下方各有一个数。如下图所示:从第一行开的数开始走,每次可以往下或右走一格,直到走到...

【算法】动态规划(三)——解题方法与解题思路

0.前言动态规划最核心的思想就是:拆分子问题,记住过往,减少重复计算。动态规划可以从下面的参考网上的一个例子:A :"1+1+1+1+1+1+1+1 =?"...