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

【算法】归并排序

亿万年的星光4年前 (2022-04-09)算法3328

【参考代码】

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, j=mid+1, 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(i<=mid){  //复制 右边子序列剩余 
		r[k]=a[j];
		k++;
		j++;
	}
	for(int i=s;i<=t;i++)
		a[i]=r[i]; 
}

【图解】


【合并过程】

比较a[i]和a[j]的大小,若a[i]<=a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;否则将第二个有序表中的元素a[j]复制到r[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到r中从下标k到下标t的单元。

归并排序的算法我们通常用递归实现,先把排序区间[s,t]以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并成有序的区间[s,t]。



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

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

    分享给朋友:

    相关文章

    【算法】广度优先搜索算法(BFS)

    【算法】广度优先搜索算法(BFS)

    一、广度优先搜索的过程    广度优先搜索算法(又称宽度优先搜索算法,BFS)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra...

    【算法】归并排序

    【算法】归并排序

    一、基本思想归并排序的核心思想是将两个已经有序的子序列合并成一个有序序列。整个过程分为两个主要步骤: 1.分解:将待排序的序列不断二分,直到每个子序列只包含一个元素(此时自然有序) ...

    【二分】----基础用法

    【二分】----基础用法

    0.二分法简介二分法是一种查找算法要求:数据必须是有序序列核心思想:掐头去尾取中间1. 引入对于一个有序数组,如{1,3,6,8,23,56,78,99},如果我们要查找其中的一个数78的下标位置,按...

    【算法】最短路径算法——Floyed-Warshell算法

    【算法】最短路径算法——Floyed-Warshell算法

    如下图所示,我们把边带有权值的图称为带权图。边的权值可以理解为两点之间的距离。一张图中任意两点间会有不同的路径相怜。最短路径就是指连接两点的这些路径中最短的一条。【注意】边的权值可以为负。当出现负边权...

    【算法】滑动窗口1—窗口大小固定

    【算法】滑动窗口1—窗口大小固定

    一、定义滑动窗口算法(Sliding Window Algorithm)是一种用于解决数组或字符串中子数组或子串问题的优化技术。它通过维护一个窗口(通常是数组或字符串的一个连续子区间),在遍历过程中动...

    【贪心】----排队打水

    【贪心】----排队打水

    一、基础版排队打水【题目描述】学校里有一个水房,水房里一共装有m 个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为1。现在有n 名同学准备接水,他们的初始接水顺序已经确定。...