用C语言解决逆序对问题,要求第一行,一个数 n,表示序列中有 n 个数。 第二行 n 个数,表示给定的序列。序列中每个数字不超10^9。输出序列中逆序对的数目。
时间: 2023-12-20 16:03:59 浏览: 86
以下是使用归并排序的 C 语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
long long merge(int *arr, int *temp, int left, int mid, int right) {
int i = left, j = mid, k = left;
long long count = 0;
while (i <= mid - 1 && j <= right) {
if (arr[i] <= arr[j]) {
temp[k++] = arr[i++];
} else {
temp[k++] = arr[j++];
count += mid - i;
}
}
while (i <= mid - 1)
temp[k++] = arr[i++];
while (j <= right)
temp[k++] = arr[j++];
for (i = left; i <= right; i++)
arr[i] = temp[i];
return count;
}
long long mergeSort(int *arr, int *temp, int left, int right) {
long long count = 0;
if (left < right) {
int mid = (left + right) / 2;
count += mergeSort(arr, temp, left, mid);
count += mergeSort(arr, temp, mid + 1, right);
count += merge(arr, temp, left, mid + 1, right);
}
return count;
}
int main() {
int n;
scanf("%d", &n);
int *arr = (int *) malloc(sizeof(int) * n);
int *temp = (int *) malloc(sizeof(int) * n);
for (int i = 0; i < n; i++)
scanf("%d", &arr[i]);
long long count = mergeSort(arr, temp, 0, n - 1);
printf("%lld\n", count);
free(arr);
free(temp);
return 0;
}
```
在归并排序的过程中,我们统计逆序对的个数,即在合并过程中,当右边的元素小于左边的元素时,说明右边的元素和左边的所有未合并的元素都构成逆序对,此时将逆序对个数加上左半部分未合并的元素个数即可。时间复杂度为 O(nlogn)。
阅读全文