首页 > 编程语言 >基础算法模板之归并排序

基础算法模板之归并排序

时间:2023-03-16 19:36:15浏览次数:39  
标签:sort 归并 int mid merge 序列 排序 模板 逆序

归并排序

1.算法分析

归并排序是分治的思想,将一个序列分为多个子序列,先让每个子序列有序,再合并已有序的子序列。

  • 把长度为n的输入序列分成两个长度为n/2的子序列;
  • 对这两个子序列分别采用归并排序;
  • 将两个排序好的子序列合并成一个最终的排序序列。

2.代码实现

void merge_sort(int q[],int l,int r)
{
	if(l >= r) return;
	int mid = l + r >> 1;
	merge_sort(q,l,mid);
	merge_sort(q,mid + 1,r);
	int k = 0,i = l,j = mid + 1;
	while(i <= mid && j <= r)
	{
		if(q[i] < q[j]) tmp[k ++ ] = q[i ++ ];
		else tmp[k ++ ] = q[j ++ ];
	}
	while(i <= mid) q[k ++ ] = q[i ++ ];
	while(j <= mid) q[k ++ ] = q[j ++ ];
	for(int i = l,j = 0;i <= r;i ++ ,j ++ )
		q[i] = tmp[j];
}

3.算法分析

稳定性:稳定
时间复杂度:
最好情况:o(n)
最坏情况:o(\(n^2\))
平均情况:o(n\(log_2\)n)
空间复杂度:o(n)

4.扩展-计算逆序对数量

如果将一个数组分为左右两部分,则整个数组中的逆序对数量应该等于左边的逆序对数量 + 右边的逆序对数量 + 对左边每个数可能和右边结合产生的逆序对的数量。因此可以考虑归并过程中计算逆序对数量。
逆序对:如1 3 4 2 5,其中3和2就是一组逆序对
代码如下:

long long merge_sort(int q[],int l,int r)
{
	if(l >= r) return 0;
	int mid = l + r >> 1;
	long long res = merge_sort(q,l,mid) + merge_sort(q,mid + 1,r);
	int k = 0,i = l,j = mid + 1;
	while(i <= mid && j <= r)
	{
		if(q[i] <= q[j]) tmp[k ++ ] = q[i ++ ];
		else
		{
			// q[i]到q[mid]这mid-i+1个数一定都和q[j]构成逆序对
			res += mid - i + 1; 
			tmp[k ++ ] = q[j ++ ];
		}
	}
	while(i <= mid) tmp[k ++ ] = q[i ++ ];
	while(j <= mid) tmp[k ++ ] = q[j ++ ];
	for(int i = l,j = 0;i <= r;i ++ ,j ++ )
		q[i] = tmp[j];
	return res;
}

标签:sort,归并,int,mid,merge,序列,排序,模板,逆序
From: https://www.cnblogs.com/zhiao/p/17223876.html

相关文章

  • 基本算法模板之快速排序
    快速排序1.算法描述从数列中挑出一个元素,称为"基准";重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这......
  • python 类中的属性排序
    可以使用Python中的类(class)来定义一个包含姓名和年龄的类。以下是一个示例代码:classPerson:def__init__(self,name,age):self.name=namese......
  • 泛型对象的应用:常规业务逻辑模板化,使用通用的父类来定义字段,具体字段由实现类来赋予数
    泛型对象的应用:常规业务逻辑模板化,使用通用的父类来定义字段,具体字段由实现类来赋予数据//DEMO-1publicinterfaceCommonTemplateService<T,F>{publicTbuildCa......
  • 【设计模式】模板方法
    1.模板方法(TemplateMethod)的定义模板方法模式是一种行为设计模式,它在超类中定义一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤。模板是对多种事物的结......
  • MasaFramework入门第二篇,安装MasaFramework了解各个模板
    安装MasaFramework模板执行以下命令安装最新Masa的模板dotnetnew--installMasa.Template安装完成将出现四个模板MasaBlazorApp:MasaBlazorApp的模板创建的是......
  • 冒泡排序
    1.描述:冒泡排序是一种常见的排序方法,遍历若干个需要排序的数列,依次比较相邻两个数值的大小,前者比后者大调换位置,渐进式循环后大的数值都会在最后,重复此操作直到出现有序的......
  • list数组转tree树结构,并排序
    setTree(data){consttree=[];data.forEach(item=>{constchildren=this.list.filter(e=>e.parentId===item.id)if(children.length){......
  • 冒泡排序
    vararr:array[0..5]ofinteger;i,j:integer;itemp:integer;beginarr[0]:=1;arr[1]:=71;arr[2]:=5;arr[3]:=31;arr[4]:=2;arr[5]:=12;fori:=5d......
  • 冒泡排序的另一种写法
    vararr:array[0..5]ofinteger;i,j:integer;itemp:integer;beginarr[0]:=1;arr[1]:=71;arr[2]:=5;arr[3]:=31;arr[4]:=2;arr[5]:=12;fori:=0t......
  • 并归排序算法
    【说明】采用归并排序对n个元素进行递增排序时,首先将n个元素的数组分成各含/2个元素的两个子数组,然后用归并排序对两个子数组进行递归排序,最后合并两个已经排好序的......