3.设计寻找两个等长有序序列的中位数的算法。用C语言写出程序算法
时间: 2024-11-30 07:20:55 浏览: 5
以下是使用C语言编写的寻找两个等长有序序列的中位数的算法:
```c
#include <stdio.h>
// 寻找两个等长有序序列的中位数
double findMedian(int arr1[], int arr2[], int n) {
int i = 0, j = 0, count;
int m1 = -1, m2 = -1;
// 遍历到数组长度的一半
for (count = 0; count <= n; count++) {
// 如果第一个数组的当前元素小于第二个数组的当前元素,或者第二个数组已经遍历完
if (i < n && (j == n || arr1[i] < arr2[j])) {
m1 = m2;
m2 = arr1[i++];
} else {
m1 = m2;
m2 = arr2[j++];
}
}
// 如果数组长度是奇数,返回中间的元素
if (n % 2 == 1) {
return m2;
} else {
// 如果数组长度是偶数,返回中间两个元素的平均值
return (m1 + m2) / 2.0;
}
}
int main() {
int arr1[] = {11, 13, 15, 17, 19};
int arr2[] = {2, 4, 6, 8, 20};
int n = sizeof(arr1) / sizeof(arr1[0]);
double median = findMedian(arr1, arr2, n);
printf("中位数是: %.2f\n", median);
return 0;
}
```
### 解释
1. **函数 `findMedian`**:
- 参数 `arr1` 和 `arr2` 是两个等长的有序数组。
- 参数 `n` 是数组的长度。
- 使用两个指针 `i` 和 `j` 分别遍历两个数组。
- 变量 `m1` 和 `m2` 用于记录当前遍历到的两个中间值。
- 遍历到数组长度的一半时,根据数组长度的奇偶性返回中位数。
2. **主函数 `main`**:
- 定义两个有序数组 `arr1` 和 `arr2`。
- 计算数组的长度 `n`。
- 调用 `findMedian` 函数计算中位数并输出结果。
这个程序通过合并两个有序数组的一部分来找到中位数,时间复杂度为 O(n),其中 n 是数组的长度。
阅读全文