归并排序法求数组中的倒置数量

如果一对元素(A[i],A[j])是倒序的,即i < j但是A[i] > A[j],则他们被称为一个倒置。设计o(nlogn)的算法来计算数组中的倒置数量

利用归并排序实现源码如下:

#include <iostream>
#include <cassert>
using namespace std;

void Merge(int *left,int leftSize,int *right,int rightSize,int *result,int &reverseNum)
{
	int *left_end = left + leftSize;
	int *right_end = right + rightSize;
	while(left < left_end && right < right_end) {
		if(*left > *right) {
			*result++ = *right++;
			reverseNum += (left_end - left);
		} else
			*result++ = *left++;
	}
	while(left < left_end)
		*result++ = *left++;
	while(right < right_end)
		*result++ = *right++;
}

void MergeSort(int *arr,int len,int &reverseNum)
{
	if(len == 1)
		return;
	int leftSize = len / 2,rightSize = len - len / 2;
	int *left = new int[leftSize];
	int *right = new int[rightSize];
	for(int i = 0; i < leftSize; i++)
		left[i] = arr[i];
	for(int i = 0; i < rightSize; i++)
		right[i] = arr[i + leftSize];
	MergeSort(arr,leftSize,reverseNum);
	MergeSort(arr + leftSize,rightSize,reverseNum);
	Merge(left,right,arr,reverseNum);
	delete[] left;
	delete[] right;
}

int calReversePair(int *arr,int len)
{
	assert(arr);
	int reverseNum = 0;
	MergeSort(arr,len,reverseNum);
	return reverseNum;
}

int main()
{
	int a[] = {8,7,6,5,4,3,2,1};
	cout << calReversePair(a,sizeof(a) / sizeof(a[0])) << endl;
	return 0;
}
运行结果为:28

相关文章

迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图...
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,...
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定...
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个...
命令模式(Command)命令模式(Command)[Action/Transactio...
生成器模式(Builder)生成器模式(Builder)意图:将一个对...