编程求逆序数

编程求逆序数

    逆序数,也就是一个排列中当某一对元素的先后次序与标准次序(从小到大)不同时,就说它构成一个逆序。

    如:3 5 2 1 4 的逆序数:2+3+1+0+0=6   ,3与2,1; 5与2,1,4; 2与1,就是找出排列第i个数后有几个比它小的数,有几个就有几个逆序数,遍历该排列,找出所有逆序数并求和就是该排列的总逆序数。

    话不多说,直接上代码

#include
int count=0; 
int main()
{
	int n = 5;
	int a[n] = {3,5,2,1,4};	
	
	for(int i = 0; i < n; i++)
		for(int j = i; j < n; j++)
		{
			if(a[i]>a[j])
				count++;	
		}
	printf("count = %d\n",count);
	return 0;	
} 

上述方法的时间复杂度为O(N^2)

下面是基于归并排序的求逆序数的方法,比较关键的步骤是合并,合并步骤是将已两个排好序的数组进行合并,当a[i]>a[j]时,i到mid间的数都大于a[j],把a[j]放到a[i]前面时,就产生了mid-i+1个逆序数,此时做累加记录,若a[i]

#include
int count = 0;

void merge(int a[],int left,int mid,int right)
{
	int i = left,j = mid+1,k = left;
	int b[N];
	
	while((i<=mid) && (j<=right))
	{
		if(a[i]>a[j])
		{
			b[k] = a[j++];
			count += mid-i+1;	
		}
		else
		{
			b[k] = a[i++];
		}
		k++;
	}
	
	while(i<=mid)
		b[k++] = a[i++];
	while(j<=right)
		b[k++] = a[j++];	
	for(int t = left;t<=right; t++)
		a[t] = b[t];
}

void reverse_count(int a[],int left,int right)
{
	if(left

该方法基于归并排序,时间复杂度为O(NlogN)。

你可能感兴趣的:(【leetcode】)