#include <iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[101] = {0};
int r[101] = {0};//用来临时存储
int N=0;
int t=0; //存储逆序对
void qsort(int l,int h){
if(l>=h) return; //已为单元素区间 => 已ok
int mid = (l+h)/2;
//归并=>先递归后排序 => 小->大
//快速=>先排序后递归 => 大->小
//递归的等效原则
qsort(l,mid);
qsort(mid+1,h);
int i=l,j=mid+1; //确定初始位置
int k=l; //临时存储的下标
while(i<=mid && j<=h){
while(a[i] < a[j]){ //Q
r[k] = a[i];
i++;
k++;
}
//遇到a[i] >= a[j]
if(a[i] > a[j]) t+= j-mid;
r[k] = a[j];
j++;
k++;
}
//放入剩余的量
while(i<=mid){
r[k] = a[i];
k++;i++;
}
while(j<=h){
r[k] = a[j];
k++;j++;
}
//将临时->永久
for(i=l;i<=h;i++){
a[i] = r[i];
}
}
int main()
{
cin >> N;
for(int i=1;i<=N;i++){
cin >> a[i];
}
qsort(1,N);
cout << t;
return 0;
}
//cout << "输入:"
练习4 - 求排列的逆序数
最新推荐文章于 2022-07-07 19:18:08 发布