python 逆序对的数量【简单易懂,代码直接运行】
给定一个长度为 n 的整数数列,请你计算数列中的逆序对的数量。
逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i<j 且 a[i]>a[j],则其为一个逆序对;否则不是。
输入格式
第一行包含整数 n,表示数列的长度。
第二行包含 n 个整数,表示整个数列。
输出格式
输出一个整数,表示逆序对的个数。
数据范围
1≤n≤100000,
数列中的元素的取值范围 [1,109]。
输入样例:
6
2 3 4 5 6 1
输出样例:
5
这道题是先用归并排序进行递归排序,讲排序的数组缩短到一个元素,然后进行比较。逆序对是前面的数值比后面的数值大。这里当数组两边排好序后,第i个元素满足逆序对的条件,那么从i到mid的元素都满足逆序对的条件,此时的res是加上mid - i + 1并且不断对原数组进行排序
注意C++要注意数值的范围,要把函数和结果都设置位long long数据类型才可以。否则报内存错误
C++代码
#include<iostream>
#include<stdio.h>
using namespace std;
const int N = 100010;
int q[N],tmp[N];
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;
int i = l;
int j = mid + 1;
while(i <= mid && j <= r)
{
if(q[i] <= q[j]){
tmp[k++] = q[i++];
}
else{
res = res + (mid - i + 1);//因为一侧是完全排好序的,因此一个数比目标大,这个数后面的所有的数都比该目标大
tmp[k++] = q[j++];
}
}
while(i <= mid){
tmp[k++] = q[i++];
}
while(j <= r){
tmp[k++] = q[j++];
}
for(i = l,j = 0;i <= r;i++,j++) q[i] = tmp[j];
return res;
}
int main()
{
int n,i,rese;
cin>>n;
for(i = 0;i < n;i++) cin>>q[i];
cout<<merge_sort(q,0,n - 1)<<endl;
return 0;
}
Python代码
def merge_sort(s,l,r):
if l >= r: return 0
mid = l + r >> 1
res = merge_sort(s,l,mid) + merge_sort(s,mid + 1,r)
i = l
j = mid + 1
tmp = []
while(i <= mid and j <= r):
if(s[i] <= s[j]):
tmp.append(s[i])
i += 1
else:
res += (mid - i + 1)
tmp.append(s[j])
j += 1
pass
pass
while(i <= mid):
tmp.append(s[i])
i += 1
pass
while(j <= r):
tmp.append(s[j])
j += 1
pass
s[l:r + 1] = tmp
return res
n = eval(input())
s = list(map(int,input().split()))
print(merge_sort(s, 0, n - 1))
点个👍吧