题目:
描述
输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。
输入描述:
输入包含三行,
第一行包含两个正整数n, m,用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。
第二行包含n个整数,用空格分隔。
第三行包含m个整数,用空格分隔。
思路:
总体思路:
(一).
输入 n 和 m,
定义变长数组arr1 和 arr2(牛客网是支持变成数组的),
对变长数组进行赋值
(二).
进行合并:
定义第三个变长数组 arr3 ,分别定义三个数组的下标 i、j、k ,
使用 while循环,arr1 和 arr2 都有值时进行合并,合并到 arr3,
使用 if条件判断语句 将 arr1 小于 arr2 的值赋给 arr3,调整两数组下标,
使用 else语句 将 等于 或 arr2 < arr1 的值赋给 arr3,调整两数组下标
(三).
进行完(二)中的步骤后,
跳出循环说明有一个数组已经遍历完了,
此时 i、j、k 下标都已经移动到了合适的位置,
先判断是哪个数组遍历完了:
如果 i == n,说明是 arr1 遍历完了,则把 arr2 中剩余的元素全部放入 arr3 中;
其它情况(j == m),说明是 arr2 遍历完了,则把 arr1 中剩余的元素全部放入 arr3 中。
进行打印
第一步:
(1). 输入n 和 m
(2). 定义变长数组 arr1 和 arr2
(3). 对变长数组进行赋值
实现代码:
#include <stdio.h> int main() { //输入 n 和 m int n = 0; int m = 0; scanf("%d %d", &n, &m); //定义变长数组: int arr1[n]; int arr2[m]; //对变长数组进行赋值 int i = 0; for (i = 0; i < n; i++) //前面输入的n就是arr1的长度 { scanf("%d", &arr1[i]); } i = 0; for (i = 0; i < m; i++) //前面输入的m就是arr1的长度 { scanf("%d", &arr2[i]); } return 0; }
实现图片:
第二步:
开始合并:
(1). 定义第三个变长数组arr3,定义三个变长数组的下标:i、j、k
(2).使用 while循环,arr1 和 arr2 都有值时进行合并,合并到 arr3
(2).使用 while循环,arr1 和 arr2 都有值时进行合并,合并到 arr3,
(3).使用 if条件判断语句 将 arr1 小于 arr2 的值赋给 arr3,调整两数组下标,
使用 else语句 将 等于 或 arr2 < arr1 的值赋给 arr3,调整两数组下标
实现代码:
#include <stdio.h> int main() { //输入 n 和 m int n = 0; int m = 0; scanf("%d %d", &n, &m); //定义变长数组: int arr1[n]; int arr2[m]; //对变长数组进行赋值 int i = 0; for (i = 0; i < n; i++) //前面输入的n就是arr1的长度 { scanf("%d", &arr1[i]); } i = 0; for (i = 0; i < m; i++) //前面输入的m就是arr1的长度 { scanf("%d", &arr2[i]); } //开始合并: //定义第三个变长数组arr3,存放两arr1 和 arr2合并后的结果: int arr3[n + m]; //变长数组不能初始化 //定义三个变长数组的下标: i = 0; //arr1下标 int j = 0; //arr2下标 int k = 0; //arr3下标 //使用 while循环, while (i<n && j<m) //i<n:arr1下标小于arr1长度,说明arr1还有值 //j<m:arr2下标小于arr2长度,说明arr2还有值 //两个数组都有值才用进行比较赋值 { if (arr1[i] < arr2[j]) //arr1的值小于arr2的值 { arr3[k] = arr1[i]; //把大的值赋给arr3 //给值 和 被给值 的数组下标都用往后移 k++; i++; } else //等于时放谁都一样 或 arr2变得比较小了 { arr3[k] = arr2[j]; //把大的值赋给arr3 //给值 和 被给值 的数组下标都用往后移 k++; j++; } } return 0; }
实现图片:
第三步:
进行完(二)中的步骤后,
跳出循环说明有一个数组已经遍历完了,
此时 i、j、k 下标都已经移动到了合适的位置,
(1). 先判断是哪个数组遍历完了:
如果 i == n,说明是 arr1 遍历完了,则把 arr2 中剩余的元素全部放入 arr3 中;
其它情况(j == m),说明是 arr2 遍历完了,则把 arr1 中剩余的元素全部放入 arr3 中。
(2). 进行打印
实现代码:
#include <stdio.h> int main() { //输入 n 和 m int n = 0; int m = 0; scanf("%d %d", &n, &m); //定义变长数组: int arr1[n]; int arr2[m]; //对变长数组进行赋值 int i = 0; for (i = 0; i < n; i++) //前面输入的n就是arr1的长度 { scanf("%d", &arr1[i]); } i = 0; for (i = 0; i < m; i++) //前面输入的m就是arr1的长度 { scanf("%d", &arr2[i]); } //开始合并: //定义第三个变长数组arr3,存放两arr1 和 arr2合并后的结果: int arr3[n + m]; //变长数组不能初始化 //定义三个变长数组的下标: i = 0; //arr1下标 int j = 0; //arr2下标 int k = 0; //arr3下标 //使用 while循环, while (i < n && j < m) //i<n:arr1下标小于arr1长度,说明arr1还有值 //j<m:arr2下标小于arr2长度,说明arr2还有值 //两个数组都有值才用进行比较赋值 { if (arr1[i] < arr2[j]) //arr1的值小于arr2的值 { arr3[k] = arr1[i]; //把大的值赋给arr3 //给值 和 被给值 的数组下标都用往后移 k++; i++; } else //等于时放谁都一样 或 arr2变得比较小了 { arr3[k] = arr2[j]; //把大的值赋给arr3 //给值 和 被给值 的数组下标都用往后移 k++; j++; } } //跳出循环说明有一个数组已经被遍历完了 //此时,i、j、k 都已经移动到了合适的位置 //判断哪个数组遍历完了进行操作: if (i == n) //arr1下标等于arr1数组长度,说明arr1遍历完了 { //将arr2中剩余的元素全部放入arr3中: while (j < m)//arr2下标小于arr2数组长度就继续放 { arr3[k] = arr2[j]; k++; j++; } } else //arr2遍历完 { //将arr1中剩余的元素全部放入arr3中: while (i < n)//arr1下标小于arr1数组长度就继续放 { arr3[k] = arr1[i]; k++; i++; } } //进行打印: for (i = 0; i < n + m; i++) { printf("%d ", arr3[i]); } return 0; }
实现图片:
最终代码和实现效果
最终代码:
#include <stdio.h> int main() { //输入 n 和 m int n = 0; int m = 0; scanf("%d %d", &n, &m); //定义变长数组: int arr1[n]; int arr2[m]; //对变长数组进行赋值 int i = 0; for (i = 0; i < n; i++) //前面输入的n就是arr1的长度 { scanf("%d", &arr1[i]); } i = 0; for (i = 0; i < m; i++) //前面输入的m就是arr1的长度 { scanf("%d", &arr2[i]); } //开始合并: //定义第三个变长数组arr3,存放两arr1 和 arr2合并后的结果: int arr3[n + m]; //变长数组不能初始化 //定义三个变长数组的下标: i = 0; //arr1下标 int j = 0; //arr2下标 int k = 0; //arr3下标 //使用 while循环, while (i < n && j < m) //i<n:arr1下标小于arr1长度,说明arr1还有值 //j<m:arr2下标小于arr2长度,说明arr2还有值 //两个数组都有值才用进行比较赋值 { if (arr1[i] < arr2[j]) //arr1的值小于arr2的值 { arr3[k] = arr1[i]; //把大的值赋给arr3 //给值 和 被给值 的数组下标都用往后移 k++; i++; } else //等于时放谁都一样 或 arr2变得比较小了 { arr3[k] = arr2[j]; //把大的值赋给arr3 //给值 和 被给值 的数组下标都用往后移 k++; j++; } } //跳出循环说明有一个数组已经被遍历完了 //此时,i、j、k 都已经移动到了合适的位置 //判断哪个数组遍历完了进行操作: if (i == n) //arr1下标等于arr1数组长度,说明arr1遍历完了 { //将arr2中剩余的元素全部放入arr3中: while (j < m)//arr2下标小于arr2数组长度就继续放 { arr3[k] = arr2[j]; k++; j++; } } else //arr2遍历完 { //将arr1中剩余的元素全部放入arr3中: while (i < n)//arr1下标小于arr1数组长度就继续放 { arr3[k] = arr1[i]; k++; i++; } } //进行打印: for (i = 0; i < n + m; i++) { printf("%d ", arr3[i]); } return 0; }
实现效果: