数组中的逆序对

数组中的逆序对_第1张图片


class Solution {
    int count;
    //—————————————————————归并排序————————————————————/
//将arr[l...mid]和arr[mid + 1...r]两部分进行归并

void __merge(vector& nums, int L, int mid, int R)
{
	
	//开辟零时空间
	int *aux=new int [1+R-L] ;
	//给开辟的空间赋值
	for (int i = L; i <= R; i++)
	{
		aux[i-L] = nums[i];
	}
	int i = L;
	int j = mid + 1;
	for (int k=L;k<=R;k++)
	{
		if (i > mid)
		{
            
			nums[k] = aux[j-L];
			j++;
		}
		else if (j > R)//不需要在统计count,因为已经统计过了
		{
            
			nums[k] = aux[i-L];
			i++;
		}//只有i,j不越界,才能进行下面的归并
		else if (aux[i-L] <= aux[j-L])//需要小于等于,因为逆序不包含等于
		{

			nums[k] = aux[i-L];
			i++;
		}
		else {
            count=count+mid-i+1;
			nums[k] = aux[j-L];
			j++;
		}
 
	}
	delete[] aux;
}
 
//排序的数组,起始索引,终止索引 对arr[l....r]的范围进行排序

void __mergeSort(vector& nums, int L, int R )
{
	if (L >= R)
		return;
	int mid = L+(R-L) / 2;
	__mergeSort(nums, L, mid);
	__mergeSort(nums, mid+1,R );
	__merge(nums, L, mid, R);
	
 
}
 

void mergeSort(vector& nums, int n)
{
	//排序的数组,起始索引,终止索引
	__mergeSort(nums, 0 ,n - 1);
}
public:
    int reversePairs(vector& nums) {

        if(nums.size()==0||nums.size()==1)return 0;
        mergeSort(nums,nums.size());
        return count;
    }
};

 

你可能感兴趣的:(剑指offer)