#include <bits/stdc++.h>
using namespace std;
long long int cnt; //逆序数可能是个数值很大的数字,用long long int.
void Merge(int a[], int l, int mid, int r) //归并:进来一个无序数组(已用mid进行了二分,一直mid、l、r)将进来的分为两部分的数组进行排序,后存入新开的t数组中
{
int t[100005]; //int t[] = new int [r - l + 1]申请一个(r - l + 1)个int元素的内存空间,相当于一个n个int元素的数组 int t[r - l + 1]
int i = l, j = mid + 1, k = 0;
while(i <= mid && j <= r) //中间连接符用的是&&,也就是说重要不符合其中一个条件就跳出循环
{
if (a[i] > a[j])
{
t[k++] = a[j++];
cnt = cnt + (mid - i + 1); //求逆序对数
}
else t[k++] = a[i++];
}
while(i <= mid) t[k++] = a[i++];//跳出循环后,若是在(l,mid)数组内还有未比较到的数字,说明这些数字都大于之前那些比较过的数字, 则直接放在数列的后边
while(j <= r) t[k++] = a[j++];
for (k = 0, i = l; i <= r ; k++, i++)
a[i] = t[k]; //将最终排好序的数组再由t重新赋给a数组
}
void Msort(int a[], int l, int r)
{
if (l < r)
{
int mid = (l + r) / 2;
Msort(a, l, mid);
Msort(a, mid + 1, r);
Merge(a, l, mid, r); //每当两个被分割好的数组进来归并,就用归并好的这两个小数组的数替换原来的数字,纸质全部替换完,归并排序结束
}
}
int main()
{
int n,i,a[100005];
cin>>n;
for(i = 0;i <= n - 1;i++)
{
cin>>a[i];
}
Msort(a,0,n - 1);
cout<<cnt<<endl;
return 0;
}
数据结构实验之排序五:归并求逆序数
最新推荐文章于 2022-05-31 18:14:45 发布