描述
简述
详细实现
(图片参考陈越《数据结构》第二版)
代码
#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;
}