数组中的逆序对

题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。


用归并排序算法,归并的时候,从后向前归并。


#include <iostream>
using namespace std;

int getreversenum(int *p1,int *p2,int left,int right)
{
	if (!p1||!p2||left<0||right<0||left>right)
	{
		return -1;
	}
	if (left==right)
	{
		p2[left]=p1[left];
		return 0;
	}
	int mid=left+(right-left)/2;
	int left_num=getreversenum(p1,p2,left,mid);
	int right_num=getreversenum(p1,p2,mid+1,right);
	int left_end=mid;
	int right_end=right;
	int merge_end=right;
	int count=0;
	while(left_end>=left&&right_end>=mid+1)
	{
		if (p1[left_end]>p1[right_end])
		{
			p2[merge_end--]=p1[left_end--];
			count+=right_end-mid;
		}
		else
		{
			p2[merge_end--]=p1[right_end--];
		}
	}
	while(left_end>=left)
	{
		p2[merge_end--]=p1[left_end--];
	}
	while(right_end>=mid+1)
	{
		p2[merge_end--]=p1[right_end--];
	}
	for (int i=left;i<=right;++i)
	{
		p1[i]=p2[i];
	}
	return left_num+right_num+count;
}

int _tmain(int argc, _TCHAR* argv[])
{
	int a[]={7,5,6,4};
	int b[4];
	int c=getreversenum(a,b,0,0);
	return 0;
}


原文地址:https://www.cnblogs.com/chhuach2005/p/3961694.html