《算法导论》6、计算一个数组中逆序数的个数(C++,使用合并排序改编)

#include <iostream>
using namespace std;
int merge(int A[], int p, int q, int r);
int merge_sort(int A[], int p, int r);
void main()
{
	int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	cout << merge_sort(a, 0, 17) << endl;
	system("pause");
}
int merge(int A[], int p, int q, int r) {
	int i, j, k, inversions = 0;

	int n1 = q - p + 1;
	int n2 = r - q;

	int *L = new int[n1];
	int *R = new int[n2];

	for (i = 0; i < n1; i++) L[i] = A[p + i];
	for (j = 0; j < n2; j++) R[j] = A[q + j + 1];

	for (i = 0, j = 0, k = p; k <= r; k++) {
		if (i == n1) {
			A[k] = R[j++];
		}
		else if (j == n2) {
			A[k] = L[i++];
		}
		else if (L[i] <= R[j]) {
			A[k] = L[i++];
		}
		else {
			A[k] = R[j++];
			inversions += n1 - i;  //L比R小,计做一次逆序
			//这里巧妙地利用了一个前提条件,LR都是有序的
		}
	}

	return inversions;
}

int merge_sort(int A[], int p, int r) {
	if (p < r) {
		int inversions = 0;
		int q = (p + r) / 2;
		inversions += merge_sort(A, p, q);
		inversions += merge_sort(A, q + 1, r);
		inversions += merge(A, p, q, r);
		return inversions;
	}
	else {
		return 0;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值