逆序对 C++

#include <bits/stdc++.h>
using namespace std;
int num = 0;
/*
查找排列的逆序数
*/
//MergesortandCut
void MergeandCut(int a[],int L, int mid,int R){     
    int* temp = new int[R - L + 1];
    int i = L;
    int j = mid + 1;
    int t = 0;
    //同等长度的纳入完成
    while( i <= mid && j <= R){
        if(a[i] > a[j]){
            //逆序对数目 这里就是课件上讲的那样
            num += j - t;
            temp[t++] = a[j++];
        }
        else
            temp[t++] = a[i++];
    }
    
    //[L,mid]内还没有遍历的纳入
    while(i <= mid)
        temp[t++] = a[i++];
    //[mid+1,R]内还没有遍历的纳入
    while(j<=R)
        temp[t++] = a[j++];
    //将归并后的数组变为原来的数组
    for(int k = 0; k <= R - L; k++)
        a[L+k] = temp[k];
    delete temp;
}

void mergesort(int a[], int L,int R){
    if(L < R){
        //分左右两个区间
        int mid = L + (R - L ) / 2;
        //对[L,mid]区间进行一直切割 知道切割到只有一个元素为一组 区间一直折半
        mergesort(a, L,mid);
        //对[mid+1,R]区间进行一直切割 知道切割到只有一个元素为一组 区间一直折半
        mergesort(a, mid+1,R);
        //分组直到都是最小的模块的时候 进行合并
        MergeandCut(a,L,mid,R);
    }
}
int main()
{
    int a[] = {1,1};
    mergesort(a,0,1);
    printf("%d",num);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值