求解逆数对:
已知一个数组a,求解该数组中逆数对的个数。
算法思想:
分治法的思想,结合归并排序,我们在归并时进行处理,当左区间存在一个数left[a]>right[b]时,我们的
逆数对个数answer+=mid-a+1。因为合并区间时,左区间一定有序,右区间也一定有序。
模板代码:
#include <iostream>
#include <algorithm>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#define rep(i,s,e) for(int i = s;i<e;i++)
using namespace std;
/**
求解逆数对:
已知一个数组a,求解该数组中逆数对的个数。
算法思想:
分治法的思想,结合归并排序,我们在归并时进行处理,当左区间存在一个数left[a]>right[b]时,我们的
逆数对个数answer+=mid-a+1。因为合并区间时,左区间一定有序,右区间也一定有序。
模板代码:
*/
const int maxn = 100000;
int Mid[maxn] = {0};
int answer = 0;
void merage(int *s , int low ,int mid,int up){
int a = low;
int b = mid+1;
for(int i =low;i<=up;i++){
Mid[i] = s[i];
}
for(int i =low;i<=up;i++){
if(a<mid){
s[i] = Mid[b++];
}else if(b>up){
s[i] = Mid[a++];
}else if(Mid[a]<=Mid[b]){
s[i] = Mid[a++];
}else{
s[i] = Mid[b++];
answer += mid-a+1;
}
}
}
void Sort(int *s,int low,int up){
if(up<=low ) return ;
else{
int mid = (low+up)/2;
Sort(s,low,mid);
Sort(s,mid+1,up);
merage(s,low,mid,up);
}
}
int main(){}