分治法-求解逆数对

求解逆数对:

已知一个数组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(){}



猜你喜欢

转载自blog.csdn.net/hnust_yangjieyu/article/details/83756812