归并排序

描述

简述

在这里插入图片描述

详细实现

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(图片参考陈越《数据结构》第二版)

代码

#include <iostream>					//7-1 逆序对
#include <algorithm>
using namespace std;
const int maxn = 1e6 + 2;

int n, ans;
int a[maxn], t[maxn];	//数组a[]与临时数组t[]

void merge(int ll, int rr)		//归并排序
{
	// 用来把 a[ll.. rr - 1] 这一区间的数排序.  t 数组是临时存放有序的版本用的.
	if(ll >= rr - 1)
		return;
	int mid = ll + (rr - ll >> 1);
	merge(ll, mid);
	merge(mid, rr);
	int p = ll, q = mid, s = ll;	//s作为基
	while (p < mid && q < rr)
		if(a[p] < a[q])
			t[s++] = a[p++];
		else			//将后面的移到前面
			t[s++] = a[q++], ans += mid - p;

	//将剩余部分直接复制给t[]
	while (p < mid)
		t[s++] = a[p++];
	while (q < rr)
		t[s++] = a[q++];

	for (int i = ll; i < rr; i++)
		a[i] = t[i];
}

/**********Beautiful Code**********/

// void merge(int ll, int rr)
// {
// 	// 用来把 a[ll.. rr - 1] 这一区间的数排序。 t 数组是临时存放有序的版本用的。
// 	if (rr - ll <= 1)
// 		return;
// 	int mid = ll + (rr - ll >> 1);
// 	merge(ll, mid);
// 	merge(mid, rr);
// 	int p = ll, q = mid, s = ll;
// 	while (s < rr)
// 	{
// 		if (p >= mid || (q < rr && a[p] > a[q]))
// 		{
// 			t[s++] = a[q++];
// 			// ans += mid - p;
// 		}
// 		else
// 			t[s++] = a[p++];
// 	}
// 	for (int i = ll; i < rr; ++i)
// 		a[i] = t[i];
// }

int main()
{
	cin >> n;

	for (int i = 0; i < n; i++)
		cin >> a[i];
	merge(0, n);
	for (int i = 0; i < n; i++)
		cout << a[i] << " ";
	cout << endl;

	cout << ans << endl;

	system("pause");
	return 0;
}

运行结果

在这里插入图片描述

应用

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值