算法导论第二章2-4 逆序对(c++)

问题描述:给出一个确定在n个元素的任何排列中逆序对数量的算法,最坏情况需要 O(nlgn)时间(提示,修改归并排序)

思路:  看到lgn,想到用分治法。分治法的三个步骤——分解,解决,合并。最关键想清楚合并如何进行。

合并:在归并排序中合并时,左边序列第一个值若大于右边序列第一个值,则左边序列所有值与右边序列第一个值都构成逆序对。

#include<iostream>

using namespace std;
 
int Merge(int * A, int p, int q, int r)
{
	int n1=q-p+1; 
	int n2=r-q;  
	int *L=new int[n1];
	for(int l=0;l<n1;l++)
	{
		L[l]=A[p+l];
	}
	
	int *R=new int[n2]; 
	for(int m=0;m<n2;m++)
	{
		R[m]=A[q+1+m];
	}
	
	int i=0;
	int j=0;
	int k=p;
	int sum=0;  
	while(i<n1 && j<n2)
	{
		if(L[i]<=R[j])
			A[k++]=L[i++]; 	     
		else
		{
			A[k++]=R[j++];
			sum+=(n1-i); 
		}	
	} 
	while(i<n1)
	A[k++]=L[i++];		
	while(j<n2)
		A[k++]=R[j++];
	delete[] L;
	delete[] R;
	return sum;	
}


int Inversion(int* A, int p, int r)
{
	int invers=0;
	if(p<r)
	{
		int q=(p+r)/2;
		invers+=Inversion(A,p,q);
		invers+=Inversion(A,q+1,r);
		invers+=Merge(A,p,q,r);
	}
	return invers;
		
}

int main()
{
	int A[5]={2,3,8,6,1};
	int invers=Inversion(A,0,4);
	cout<<invers<<endl;
	return 0;
}




 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值