剑指 Offer 51. 数组中的逆序对

package leetcode;

public class offer_51 {
    //全局变量记录逆序对
    int count=0;
    public int reversePairs(int[] nums) {
        int[] temp=new int[nums.length];
        sort(nums, 0, nums.length-1, temp);
        return count;
    }
    //归并排序
    public void sort(int[] nums,int left,int right,int[] temp) {
        if(left<right) {
            int mid=(left+right)/2;
            //归并排序左边部分
            sort(nums, left, mid, temp);
            //归并排序右边部分
            sort(nums, mid+1, right, temp);
            //合并两个部分
            merge(nums, left, mid, right, temp);
        }
    }
    public void merge(int[] nums,int left,int mid, int right,int[] temp) {
        int i=left;
        int j=mid+1;
        int t=0;
        //合并两个有序数组
        while(i<=mid&&j<=right) {
            if(nums[i]<=nums[j]) {
                //若左边部分小于右边部分,则不存在逆序对
                temp[t++]=nums[i++];
            }else {
                //若左边部分大于右边部分,因为左边部分是有序数组,则左边数组有mid-i+1个数是大于右边num[j],则为逆序对
                count=count+(mid-i)+1;
                temp[t++]=nums[j++];
            }
        }
        while(i<=mid) {
            temp[t++]=nums[i++];
        }
        while(j<=right) {
            temp[t++]=nums[j++];
        }
        
        //将temp数组中元素拷贝到原数组中
        t=0;
        while(left<=right) {
            nums[left++]=temp[t++];
        }
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        offer_51 off=new offer_51();
        int[] nums= {7,5,6,4};
        System.out.println(off.reversePairs(nums));
    }

}

 

posted on 2022-04-08 11:01  一仟零一夜丶  阅读(15)  评论(0)    收藏  举报