逆序对计数问题

分而治之:逆序对计数问题
问题:
输入一个长度长度为n的数组A[n],求出数组A[n]逆序对的总数。
输入:
长度为n的数组A[n]
输出:
数组A[n]逆序对的总数
把数组A二分为两个子数组A[1…n/2],A[n/2 + 1…n]
递归求解子问题
求解S1∶仅在A[1…n/2]中的逆序对数目
求解S2∶仅在A[n/2+1…n]中的逆序对数目
合并A[1…n/2]和A[n/2 +1…n]的解
求解S3∶跨越子数组的逆序对数目
S = S1+S2+S3

先分

逆序对计数问题_第1张图片

 再合

逆序对计数问题_第2张图片 

#include
using namespace std;
int B[20];
int MergeCount(int A[],int left,int mid,int right)
{
	 for(int i=left;i<=right;i++)
	  B[i]=A[i];
	int i=left,j=mid+1,k=0,S3=0;
	while(i<=mid && j<=right)
	{
		if(B[i]<=A[j])
		{
			A[left+k]=B[i];
			i++; k++;
		}
		else
		{
			A[left+k]=B[j];
			S3=S3+mid-i+1;
			j++; k++;
		}
	}
	while(i<=mid)
	{
		A[left+k]=B[i];
		i++; k++;
	}
	while(j<=right)
	{
		A[left+k]=B[j];
		j++; k++;
	}
	return S3;
}
int CountInver(int A[],int left,int right)
{
	if(left>=right)
	return 0;
	int mid=(left+right)/2; 
	int S1=CountInver(A,left,mid); 
	int S2=CountInver(A,mid+1,right);
	int S3=MergeCount(A,left,mid,right);
	int S=S1+S2+S3;
	return S;
}
int main()
{
	int A[12]={13,8,10,6,15,18,12,20,9,14,17,19};
	cout<

你可能感兴趣的:(算法)