用c语言设计寻找两个等长有序序列的中位数的算法
时间: 2024-11-29 09:37:21 浏览: 7
C语言数位排序共4页.pdf.zip
在C语言中,寻找两个等长有序序列的中位数可以采用双指针法。假设我们有两个有序数组A和B,它们都有相同的长度n。以下是简单的步骤和示例代码:
1. 初始化两个指针,p1和q1指向第一个数组A的第一个元素,p2和q2指向第二个数组B的第一个元素。
2. 比较p1和q1所指元素,选择较小的那个作为新的中位数候选,并移动对应指针。如果A[p1] <= B[q1],则更新中位数候选为A[p1],并将p1加一;反之,则为B[q1],并将q1加一。
3. 重复步骤2,直到其中一个指针到达数组末尾。
4. 当一个指针到达末尾时,另一个指针所在位置即为中位数。如果两个指针同时到达末尾,说明两个数组的元素相同,此时它们的共同元素就是中位数。
下面是示例C代码实现:
```c
#include <stdio.h>
double findMedianSortedArrays(int *arrA, int *arrB, int n) {
int p1 = 0, q1 = 0;
// 指针遍历到数组末尾
while (p1 < n && q1 < n) {
// 如果左侧指针处的值更小,更新中位数候选和指针
if (arrA[p1] <= arrB[q1])
return (p1 == n - 1) ? arrA[p1] : (arrA[p1] + arrB[q1]) / 2.0; // 单独处理两端情况
else
q1++; // 相反序列中值较大,移动右侧指针
}
// 左侧指针已经到达末尾,所以右侧的值就是中位数
return arrB[q1 - 1];
}
int main() {
int A[] = {1, 3, 5};
int B[] = {2, 4, 6};
int n = sizeof(A) / sizeof(A[0]);
double median = findMedianSortedArrays(A, B, n);
printf("The median of the two sorted arrays is: %.2f\n", median);
return 0;
}
```
注意:这个算法适用于等长且非空的有序数组,如果数组长度不一致或者为空,需要额外处理。
阅读全文