分治法求逆序数

1 篇文章 0 订阅
1 篇文章 0 订阅

其实分治法求逆序数相当于在归并排序的过程中加上相应的逆序数的数目就行。

假设数组A被划分成前半部分(A[left]->A[mid]),后半部分(A[mid+1],A[right])

假设前半部分与后半部分各自都是从小到大排好序的,若A[left]<A[mid+1]那么由A[mid+1]这个数与数组前半部分造成的逆序数目是mid-left+1,这个数在接下来的逆序数中不用再考虑,反之类同



#include<iostream>
using namespace std;
int merge(int *A,int left,int mid,int right){
	int *temp=new int[right-left+1];
	int num=0;
	int i=left;
	int j=mid+1;
	int k;
	int index=0;
	for(;i<=mid&&j<=right;){
		if(A[i]>A[j]){
			num+=mid-i+1;
			temp[index]=A[j];
			j++;
		}
		else{
			temp[index]=A[i];
			i++;
		}

		index++;
	}
	//i=mid的时候,A[i]位置的数还未填充到数组temp中
	//因此判断条件包含等于号
	if(i<=mid)
		for(;i<=mid;i++){
			temp[index]=A[i];
			index++;
		}

	if(j<=right)
		for(;j<right;j++){
			temp[index]=A[j];
			index++;
		}

	for(k=0;k<right-left+1;k++)
		A[left+k]=temp[k];

	delete []temp;
	return num;
}

int inversion(int *A,int left,int right){
	if(left>=right)
		return 0;
	int mid=(left+right)/2;
	int num1=inversion(A,left,mid);
	int num2=inversion(A,mid+1,right);
	return num1+num2+merge(A,left,mid,right);


}
int main(){

	int A[5]={9,8,7,6,5};
	cout<<inversion(A,0,4);
	int i;
	cin>>i;


}




评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值