数据结构C语言归并排序求逆序对
时间: 2024-12-20 15:22:51 浏览: 59
在C语言中,归并排序是一种稳定的排序算法,而计算逆序对通常是用于统计数组中元素顺序错误的情况。归并排序首先将数组分为两半,分别排序,然后合并这两个有序部分,同时计数逆序对。以下是基本步骤:
1. **分割数组**:将输入数组递归地分成两半,直到每个子数组只有一个元素。
2. **归并过程**:当两个子数组都准备好后,将它们合并成一个有序数组。在这个过程中,遍历两个数组,并比较当前元素,较小的元素放入结果数组,同时检查是否形成逆序对(即前一个元素大于后一个元素)。
3. **合并时计数**:每遇到一次逆序情况,就增加逆序对的计数。
4. **递归结束**:合并完成后,如果原始数组长度大于1,返回逆序对的数量;否则,逆序对的数量就是0。
以下是一个简单的示例代码片段,展示了如何在归并过程中计算逆序对:
```c
#include <stdio.h>
void merge(int arr[], int l, int m, int r, int* inv_count) {
int i, j, k;
int n1 = m - l + 1;
int n2 = r - m;
int L[n1], R[n2];
for (i = 0; i < n1; i++)
L[i] = arr[l + i];
for (j = 0; j < n2; j++)
R[j] = arr[m + 1+ j];
i = 0; j = 0; k = l;
while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
arr[k++] = L[i++];
} else {
arr[k++] = R[j++]; // 如果L[i] > R[j], 增加逆序对计数
(*inv_count)++;
}
}
while (i < n1)
arr[k++] = L[i++];
while (j < n2)
arr[k++] = R[j++];
}
// 归并排序函数
void mergeSort(int arr[], int l, int r, int* inv_count) {
if (l < r) {
int m = l+(r-l)/2;
mergeSort(arr, l, m, inv_count);
mergeSort(arr, m+1, r, inv_count);
merge(arr, l, m, r, inv_count);
}
}
int main() {
int arr[] = {2, 4, 1, 3, 5};
int n = sizeof(arr) / sizeof(arr[0]);
int inv_count = 0;
mergeSort(arr, 0, n-1, &inv_count);
printf("Sorted array: \n");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\nNumber of inversion pairs: %d\n", inv_count);
return 0;
}
```
在这个例子中,`mergeSort` 函数会递归地排序数组并更新 `inv_count`,最后打印出排序后的数组及其逆序对数量。
阅读全文
相关推荐


















