C语言实现分治算法给定一个序列a1,a2,…,an,如果存在i < j并且ai > aj,那么我们称之为逆序对,求逆序对的数目 输入:第一行为n,表示序列长度,接下来的n行,第i+1行表示序列中的第i个数。 输出:所有逆序对总数
时间: 2023-12-03 10:45:40 浏览: 58
以下是使用分治算法求解逆序对的C语言实现:
```c
#include <stdio.h>
int merge(int arr[], int temp[], int left, int mid, int right) {
int i = left, j = mid, k = left, 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;
}
int mergeSort(int arr[], int temp[], int left, int right) {
int mid, count = 0;
if (right > left) {
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, i;
scanf("%d", &n);
int arr[n], temp[n];
for (i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
int count = mergeSort(arr, temp, 0, n - 1);
printf("%d\n", count);
return 0;
}
```
其中,函数`merge`用于归并两个有序数组并计算逆序对的数目,函数`mergeSort`用于对序列进行归并排序,并计算逆序对的数目。主函数中,读入序列并调用`mergeSort`函数,最后输出逆序对的总数。
该算法的时间复杂度为O(nlogn),可以较快地求解较大规模的问题。
阅读全文