算法模板之归并排序

排序的同时求逆序数

#include<cstdio>
#include<cstring>
const int maxn = 1e6 +5;
int arr[maxn];
int tmp[maxn];
int cnt = 0;
void merge_arr(int left,int mid,int right)
{
    int i = left;
    int j = mid + 1;
    int np = 0;
    while(i <= mid && j <= right){
        if(arr[i] < arr[j]){
            tmp[np] = arr[i];
            np++;
            i++;
        }
        else {
            tmp[np] = arr[j];
            cnt += mid - i + 1;
            np++;
            j++;
        }
    }
    while(i <= mid){
        tmp[np] = arr[i];
        np++;
        i++;
    }
    while(j <= right){
        tmp[np] = arr[j];
        np++;
        j++;
    }
    for(int i = 0; i < np; i ++){
        arr[left + i] = tmp[i];
    }
}
void merge_sort(int left, int right){
    if(left < right){
        int mid = (left +right) / 2;
        merge_sort(left, mid);
        merge_sort(mid + 1, right);
        merge_arr(left, mid, right);
    }
}

int main()
{
    int n;

    while(~scanf("%d",&n)){
        cnt = 0;
        for(int i = 0; i < n; i ++){
            scanf("%d",&arr[i]);
        }
        merge_sort(0,n - 1);
        for(int i = 0; i < n; i ++){
            printf("%d ",arr[i]);
        }
        printf("\n");
        printf("%d\n",cnt);
    }
}

猜你喜欢

转载自www.cnblogs.com/goxy/p/9167698.html