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));
}
}