用C++写一个程序,实现给定有序表A[1:n],修改合并排序算法,求出该有序表的逆序对数,并给出程序的
时间: 2024-11-22 17:48:50 浏览: 26
在C++中,我们可以编写一个程序来实现合并排序的同时计算逆序对的数量。合并排序是一个稳定的排序算法,其核心思想是分治法,将数组分为两半,分别递归地排序,然后合并。在此过程中,可以同时检查两个元素是否构成逆序对。
```cpp
#include <iostream>
#include <vector>
// 合并函数,同时计数逆序对
int merge(std::vector<int>& arr, int left, int mid, int right, int& inv_count) {
std::vector<int> temp(right - left + 1);
int i = left, j = mid + 1, k = 0;
while (i <= mid && j <= right) {
if (arr[i] <= arr[j]) {
temp[k++] = arr[i++];
} else { // 如果arr[j] > arr[i]
temp[k++] = arr[j];
++inv_count; // 计算逆序对
j++;
}
}
// 将剩余部分复制到临时数组
while (i <= mid) {
temp[k++] = arr[i++];
}
while (j <= right) {
temp[k++] = arr[j++];
}
// 把临时数组内容放回原数组
for (i = left, k = 0; i <= right; ++i) {
arr[i] = temp[k++];
}
return inv_count;
}
// 归并排序并计算逆序对
void mergeSortWithInvCount(std::vector<int>& arr, int left, int right, int& inv_count) {
if (left < right) {
int mid = left + (right - left) / 2;
inv_count += mergeSortWithInvCount(arr, left, mid, inv_count); // 分治递归左半部分
inv_count += mergeSortWithInvCount(arr, mid + 1, right, inv_count); // 分治递归右半部分
inv_count += merge(arr, left, mid, right, inv_count); // 合并阶段
}
}
int main() {
int n;
std::cout << "Enter the number of elements: ";
std::cin >> n;
std::vector<int> A(n);
std::cout << "Enter the sorted array: ";
for (int i = 0; i < n; ++i) {
std::cin >> A[i];
}
int inv_count = 0; // 初始化逆序对计数器
mergeSortWithInvCount(A, 0, n - 1, inv_count);
std::cout << "The array is: ";
for (const auto& num : A) {
std::cout << num << " ";
}
std::cout << "\nNumber of inversion pairs: " << inv_count << std::endl;
return 0;
}
```
当你运行这个程序时,它会首先提示输入有序表A的元素数量和数组值,然后显示排序后的数组并报告逆序对的数量。
阅读全文