5.1--5.1.1 Inversions 反序(下)

讲完了反序数的个数,接下来的正文又令我大为吃惊,涉及到反序分布的问题。

反序分布

在C语言中,我们可以利用归并排序的思想来解决这个问题,因为归并排序过程中会自然地将数组分为两部分,并且每一步都是从小到大合并,这有助于我们在合并过程中统计逆序对的数量。以下是基于归并排序的解决方案: ```c #include <stdio.h> // 归并排序过程,同时计算逆序数 void mergeSort(int A[], int left, int right, int* inversions) { int mid = (left + right) / 2; int temp[right - left + 1]; if (left < mid) { mergeSort(A, left, mid, inversions); } if (mid < right) { mergeSort(A, mid + 1, right, inversions); } int i = left, j = mid + 1, k = 0; while (i <= mid && j <= right) { if (A[i] <= A[j]) { temp[k++] = A[i++]; } else { *inversions += mid - i + 1; // 当前右侧所有元素都比左侧大,所以增加了mid-i+1个逆序对 temp[k++] = A[j++]; } } while (i <= mid) { temp[k++] = A[i++]; } while (j <= right) { temp[k++] = A[j++]; } // 合并 for (i = left; i <= right; i++) { A[i] = temp[i - left]; } } // 主函数 int countInversions(int A[], int n) { int inversions = 0; mergeSort(A, 0, n - 1, &inversions); return inversions; } int main() { int A[] = {9, 7, 5, 11, 12, 2, 14, 3, 10, 6}; int n = sizeof(A) / sizeof(A[0]); int result = countInversions(A, n); printf("数组 %d 的逆序对总数为: %d\n", n, result); return 0; } ``` 当你运行此程序,它会对数组`A`计算逆序对的数量,例如对于数组`{9, 7, 5, 11, 12, 2, 14, 3, 10, 6}`,输出将是逆序对的总数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值