两个大小均为n的有序数组A,B,合并为数组C,要求输出数组C的中位数,我要C语言代码
时间: 2024-11-22 09:38:25 浏览: 10
C++实现两个有序数组的合并
5星 · 资源好评率100%
在C语言中,你可以使用分治法的思想来解决这个问题,特别是二分查找结合排序数组的优点。以下是合并两个有序数组并找到中位数的一个基本算法:
```c
#include <stdio.h>
#include <stdlib.h>
// 交换数组元素
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 合并两个已排序数组到第三个数组
int merge_sorted(int arr1[], int arr2[], int n1, int n2, int arr3[]) {
int i = 0, j = 0, k = 0;
// 将较小的元素放入arr3
while (i < n1 && j < n2) {
if (arr1[i] <= arr2[j]) {
arr3[k++] = arr1[i++];
} else {
arr3[k++] = arr2[j++];
}
}
// 如果arr1还有剩余元素
while (i < n1) {
arr3[k++] = arr1[i++];
}
// 如果arr2还有剩余元素
while (j < n2) {
arr3[k++] = arr2[j++];
}
return k;
}
// 找到两数组合并后的中位数
double find_median(int arr[], int m, int n) {
int combined_size = m + n;
int* merged_arr = malloc(combined_size * sizeof(int));
int total_merged = merge_sorted(arr, arr + m, m, n, merged_arr);
// 根据数组长度判断中位数位置
double median;
if (combined_size % 2 == 0) { // 如果数组总长度偶数
median = ((double)merged_arr[total_merged / 2 - 1] + merged_arr[total_merged / 2]) / 2.0;
} else { // 如果数组总长度奇数
median = (double)merged_arr[total_merged / 2];
}
free(merged_arr); // 释放内存
return median;
}
int main() {
int arr1[] = {1, 3, 5};
int n1 = sizeof(arr1) / sizeof(arr1[0]);
int arr2[] = {2, 4, 6};
int n2 = sizeof(arr2) / sizeof(arr2[0]);
printf("Median of the merged array is: %.2f\n", find_median(arr1, n1, n2));
return 0;
}
```
这个程序首先合并两个有序数组,然后根据合并后的数组长度计算中位数。注意,这个代码只适用于数组元素都是整数的情况。
阅读全文