LeetCode-剑指offer-JZ35 数组中的逆序对-归并排序

一、题目

在这里插入图片描述

二、思路

思路一:冒泡排序
冒泡排序交换的次数即为逆序对的个数,但是冒泡排序的复杂度为O(n^2),会超时,这里还是把代码附上

三、思路一(冒泡排序,超时)

class Solution {
public:
    int InversePairs(vector<int> data) {
        if(data.empty())
        {
            return 0;
        }
        //冒泡排序
        int Count=0;
        for(int i=0;i<data.size()-1;++i)
        {
            for(int j=0;j<data.size()-i-1;++j)
            {
                if(data[j]>data[j+1])
                {
                    swap(data[j],data[j+1]);
                    Count++;
                    Count=Count%1000000007;
                }
            }
        }
        return Count;
    }
};

四、思路二(归并排序)

class Solution {
public:
    int Count=0;
    int InversePairs(vector<int> data) {
        if(data.empty())
        {
            return 0;
        }
        //归并排序
        vector<int>temp(data.size());
        guibing(data,temp,0,data.size()-1);
        return Count;
    }
    void guibing(vector<int> &data,vector<int>& temp,int start,int end)
    {
        if(start>=end)
        {
            return;
        }
        //定义四个变量
        int left1=start;
        int mid=(start+end)/2;
        int right1=mid;
        int left2=mid+1;
        int right2=end;
        
        //递归分治
        guibing(data, temp,left1,right1);
        guibing(data, temp,left2,right2);
        
        //合并
        int k=0;
        while(left1<=right1 && left2<=right2)
        {
            if(data[left1]>data[left2])
            {
                temp[k++]=data[left2++];
                
                //精髓之处,如果前面的都小于,最后徐一个大于B序列所有数,这个会循环B序列中数的个数次
                Count=Count+right1-left1+1;
                Count=Count%1000000007;
            }
            else
            {
                temp[k++]=data[left1++];
            }
        }
        while(left1<=right1)
        {
            //Count=Count+end-mid;
            //Count=Count%1000000007;
            temp[k++]=data[left1++];
        }
        while(left2<=right2)
        {
            temp[k++]=data[left2++];
        }
        
        //将新数组复制回原数组
        int m=0;
        for(int i=start;i<=end;++i)
        {
            data[i]=temp[m++];
        }
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值