栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

算法基础——归并排序

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

算法基础——归并排序

归并排序 ( M e r g e s o r t ) (Merge sort) (Mergesort)是建立在归并操作上的一种有效排序算法,它是采用分治算法的一个典型的应用。时间复杂度为 O ( N l o g N ) O(NlogN) O(NlogN),代价是需要额外的内存空间。

算法理解

我们可以先看一个图

归并排序的思想:我们先对输入数组一直进行对半拆分,直到区间内只有一个元素的时候,一个元素肯定是有序数组,然后我们在依次合并两个有序数组。

算法步骤
  1. 对输入数组进行对半拆分,直到区间内只有一个元素
  2. 设定两个指针分别两个已经有序序列的起始位置
  3. 比较两个指针所指向的元素,相对较小的元素放到合并空间,并且指针指向下一位
  4. 重复步骤3的操作,直到有一个指针无指向内容
  5. 将另一个序列剩下的所有元素直接复制到合并空间序列尾。
代码实现
int n, a[MAXN], b[MAXN];

void msort(int l, int r){//归并排序
	if(l == r) return ;
	int mid = l + (r - l) / 2;//这里是二分的一个坑,如果l,r两个数很大,可能导致l+r出错。
	int i = l, j = mid + 1, k = l;
	msort(l,mid);
	msort(mid+1,r);
	while(i <= mid && j <= r){
		if(a[i] <= a[j]) b[k++] = a[i++];
		else b[k++] = a[j++];
	}
	while(i <= mid){
		b[k++] = a[i++];
	}
	while(j <= r){
		b[k++] = a[j++];
	}
	for(int t = l; t <= r; t++){
		a[t] = b[t];
	}
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/917279.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号