【问题描述】
对于给定的数组A,计算其逆序对的总数。即:
【输入形式】
输入包含1组测试用例。
一个测试用例占一行,第一个整数表示数组的长度,后面紧跟者数组中的各个整数元素,中间都用一个空格分开。
数组的长度
范围
每个数字A[i]的范围为
【输出形式】
输出一个整数,表示逆序对的个数。
【样例输入】
5 1 2 3 5 4
【样例输出】
1
#include <iostream>
using namespace std;
long long num = 0;
void merge(int arr[], int temp[], int l, int mid, int r) {
int i = l, j = mid + 1, k = l;
for (; i <= mid && j <= r; k++) {
if (arr[i] <= arr[j]) {
temp[k] = arr[i++];
}
else {
temp[k] = arr[j++];
num += mid - i + 1; // 在归并的过程中进行查重操作
}
}
for (; i <= mid; i++, k++) {
temp[k] = arr[i];
}
for (; j <= r; j++, k++) {
temp[k] = arr[j];
}
for (k = l; k <= r; k++) {
arr[k] = temp[k];
}
}
void Sort(int arr[], int temp[], int l, int r) {
if (l < r) {
int mid = (l + r) / 2;
Sort(arr, temp, l, mid);
Sort(arr, temp, mid + 1, r);
merge(arr, temp, l, mid, r);
}
}
int main() {
int n;
cin >> n;
int* arr = new int[n];
int* temp = new int[n];
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
Sort(arr, temp, 0, n - 1);
cout << num << endl;
delete[] arr;
delete[] temp;
return 0;
}