C++程序 合并两个已排序的数组
在许多算法问题中,需要将已排序的两个数组合并成一个按顺序排列的新数组。下面是一个C++程序,可以演示如何完成这个任务。这个程序将使用“归并排序”算法来合并两个已排序的数组。
算法介绍
归并排序是一种分治算法,它的基本思想是将原问题分解为若干个子问题解决,然后将子问题的结果合并得到原问题的解。对于本题,可以将两个已排序数组的合并视为一个归并排序的过程。
实现步骤
1.定义要合并的两个数组
首先,我们需要定义两个已排序的数组,这里我们定义两个整型数组a和b。
int a[] = {1, 3, 5, 7};
int b[] = {2, 4, 6, 8};
2.确定要合并的区域范围
接下来,我们需要确定要合并的区域。对于a和b两个数组,我们需要合并的区域是从0到数组长度减1。
int len_a = sizeof(a) / sizeof(a[0]);
int len_b = sizeof(b) / sizeof(b[0]);
int start_a = 0;
int end_a = len_a - 1;
int start_b = 0;
int end_b = len_b - 1;
3.开始合并
归并排序的核心是合并过程,我们需要编写一个函数来完成合并操作。下面是这个函数的实现:
void merge(int arr[], int start, int mid, int end) {
int num1 = mid - start + 1;
int num2 = end - mid;
int *left = new int[num1];
int *right = new int[num2];
for(int i = 0; i < num1; i++) {
left[i] = arr[start + i];
}
for(int j = 0; j < num2; j++) {
right[j] = arr[mid + 1 + j];
}
int i = 0;
int j = 0;
int k = start;
while(i < num1 && j < num2) {
if(left[i] <= right[j]) {
arr[k] = left[i];
i++;
} else {
arr[k] = right[j];
j++;
}
k++;
}
while(i < num1) {
arr[k] = left[i];
i++;
k++;
}
while(j < num2) {
arr[k] = right[j];
j++;
k++;
}
delete[] left;
delete[] right;
}
这个函数使用了两个指针left和right来表示要合并的左右两个数组,然后开始将左右两个数组合并到一个新的数组中。在这个过程中,我们需要不断比较左右数组中的元素,并将较小的元素放到合并后的数组中。
4.编写主函数
接下来,我们需要编写主函数来控制整个程序的流程。主函数中,我们要完成以下步骤:
(1)创建一个新数组,用来保存合并后的结果。
(2)按照归并排序的思路,将要合并的数组不断分解,直到每个细分数组都只有一个元素。
(3)开始将每个细分数组按顺序合并成更大的数组。
请看下面的代码:
int *result = new int[len_a + len_b];
while(start_a <= end_a && start_b <= end_b) {
if(a[start_a] <= b[start_b]) {
result[start_a + start_b] = a[start_a];
start_a++;
} else{
result[start_a + start_b] = b[start_b];
start_b++;
}
}
while(start_a <= end_a) {
result[start_a + start_b] = a[start_a];
start_a++;
}
while(start_b <= end_b) {
result[start_a + start_b] = b[start_b];
start_b++;
}
for(int i = 0; i < len_a + len_b; i++) {
cout << result[i] << " ";
}
delete[] result;
在主函数中,我们首先创建了一个新的数组result,用来保存合并后的结果。然后,按照归并排序的思路,我们不断将要合并的数组细分为较小的数组,直到每个细分数组都只有一个元素。最后,我们开始将每个细分数组按顺序合并成更大的数组,最终获得了一个按顺序排列的新数组result。
代码演示
下面是完整的C++代码,它演示了如何合并两个已排序的数组:
#include <iostream>
using namespace std;
void merge(int arr[], int start, int mid, int end) {
int num1 = mid - start + 1;
int num2 = end - mid;
int *left = new int[num1];
int *right = new int[num2];
for(int i = 0; i < num1; i++) {
left[i] = arr[start + i];
}
for(int j = 0; j < num2; j++) {
right[j] = arr[mid + 1 + j];
}
int i = 0;
int j = 0;
int k = start;
while(i < num1 && j < num2) {
if(left[i] <= right[j]) {
arr[k] = left[i];
i++;
} else {
arr[k] = right[j];
j++;
}
k++;
}
while(i < num1) {
arr[k] = left[i];
i++;
k++;
}
while(j < num2) {
arr[k] = right[j];
j++;
k++;
}
delete[] left;
delete[] right;
}
int main() {
int a[] = {1, 3, 5, 7};
int b[] = {2, 4, 6, 8};
int len_a = sizeof(a) / sizeof(a[0]);
int len_b = sizeof(b) / sizeof(b[0]);
int start_a = 0;
int end_a = len_a - 1;
int start_b = 0;
int end_b = len_b - 1;
int *result = new int[len_a + len_b];
while(start_a <= end_a && start_b <= end_b) {
if(a[start_a] <= b[start_b]) {
result[start_a + start_b] = a[start_a];
start_a++;
} else{
result[start_a + start_b] = b[start_b];
start_b++;
}
}
while(start_a <= end_a) {
result[start_a + start_b] = a[start_a];
start_a++;
}
while(start_b <= end_b) {
result[start_a + start_b] = b[start_b];
start_b++;
}
for(int i = 0; i < len_a + len_b; i++) {
cout << result[i] << " ";
}
delete[] result;
}
以上代码的输出结果为:
1 2 3 4 5 6 7 8
结论
本文介绍了一种使用C++编写程序来合并两个已排序的数组的方法。该方法基于归并排序算法的思路,实现简单易懂,是处理相似问题的有力工具。