对二路归并问题,输入两个长度为m和n的整数序列a和b,假定a和b各自都已排好序,设计算法将这两个序列合并为一个有序序列,c语言编程实现。给出代码
时间: 2024-10-26 20:03:17 浏览: 9
对二路归并问题,可以采用经典的归并排序的思想,同时遍历两个已排序的数组`a`和`b`,并将它们的元素逐个添加到结果数组`c`中,保证始终按照升序排列。以下是C语言的一个简单实现:
```c
#include <stdio.h>
void merge(int arr1[], int m, int arr2[], int n, int result[]) {
int i = 0, j = 0, k = 0;
// 当两个数组还有元素时
while (i < m && j < n) {
if (arr1[i] <= arr2[j]) {
result[k++] = arr1[i++];
} else {
result[k++] = arr2[j++];
}
}
// 将剩余的元素,如果有的话,从第一个数组复制到结果数组
while (i < m) {
result[k++] = arr1[i++];
}
// 如果第二个数组还有剩余元素,将其复制到结果数组
while (j < n) {
result[k++] = arr2[j++];
}
}
int main() {
int a[] = {1, 3, 5};
int b[] = {2, 4, 6};
int m = sizeof(a) / sizeof(a[0]);
int n = sizeof(b) / sizeof(b[0]);
int c[m + n];
merge(a, m, b, n, c);
printf("Sorted merged array: ");
for (int i = 0; i < m + n; i++) {
printf("%d ", c[i]);
}
return 0;
}
```
这个程序首先初始化了两个指针`i`和`j`分别指向两个数组的起始位置,然后比较并选择较小的元素添加到结果数组中,直到其中一个数组遍历完。最后,将另一个数组剩下的元素直接添加到结果数组。
阅读全文