当前位置:   article > 正文

C语言:输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。_c语言给定两组已按升序排列好的整型数据,合并为一组

c语言给定两组已按升序排列好的整型数据,合并为一组

题目:

描述

输入两个升序排列的序列,将两个序列合并为一个有序序列并输出

            

输入描述:

输入包含三行
            
第一行包含两个正整数n, m,用空格分隔n表示第二行第一个升序序列中数字的个数m表示第三行第二个升序序列中数字的个数
            
第二行包含n个整数,用空格分隔
            
第三行包含m个整数,用空格分隔。

                 

输出描述:

输出为一行,输出长度为n+m的升序序列,即长度为n的升序序列和长度为m的升序序列中的元素重新进行升序序列排列合并

                    

 =========================================================================

                       

思路:

总体思路:

(一).

输入 n m

定义变长数组 arr1 arr2(牛客网是支持变成数组的),

变长数组进行赋值

                    

(二).

进行合并
定义第三个变长数组 arr3 ,分别定义三个数组的下标 ijk

使用 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). 对变长数组进行赋值

                     

实现代码:

  1. #include <stdio.h>
  2. int main() {
  3. //输入 n 和 m
  4. int n = 0;
  5. int m = 0;
  6. scanf("%d %d", &n, &m);
  7. //定义变长数组:
  8. int arr1[n];
  9. int arr2[m];
  10. //对变长数组进行赋值
  11. int i = 0;
  12. for (i = 0; i < n; i++)
  13. //前面输入的n就是arr1的长度
  14. {
  15. scanf("%d", &arr1[i]);
  16. }
  17. i = 0;
  18. for (i = 0; i < m; i++)
  19. //前面输入的m就是arr1的长度
  20. {
  21. scanf("%d", &arr2[i]);
  22. }
  23. return 0;
  24. }

实现图片:

                 


                 

第二步:

开始合并:

              

(1). 定义第三个变长数组 arr3定义三个变长数组的下标ijk

              

(2).使用 while循环arr1 和 arr2 都有值时进行合并,合并到 arr3

            

(3).使用 if条件判断语句arr1 小于 arr2 的值赋给 arr3调整两数组下标

使用 else语句等于 或 arr2 < arr1 的值赋给 arr3调整两数组下标

                     

实现代码:

  1. #include <stdio.h>
  2. int main() {
  3. //输入 n 和 m
  4. int n = 0;
  5. int m = 0;
  6. scanf("%d %d", &n, &m);
  7. //定义变长数组:
  8. int arr1[n];
  9. int arr2[m];
  10. //对变长数组进行赋值
  11. int i = 0;
  12. for (i = 0; i < n; i++)
  13. //前面输入的n就是arr1的长度
  14. {
  15. scanf("%d", &arr1[i]);
  16. }
  17. i = 0;
  18. for (i = 0; i < m; i++)
  19. //前面输入的m就是arr1的长度
  20. {
  21. scanf("%d", &arr2[i]);
  22. }
  23. //开始合并:
  24. //定义第三个变长数组arr3,存放两arr1 和 arr2合并后的结果:
  25. int arr3[n + m]; //变长数组不能初始化
  26. //定义三个变长数组的下标:
  27. i = 0; //arr1下标
  28. int j = 0; //arr2下标
  29. int k = 0; //arr3下标
  30. //使用 while循环,
  31. while (i<n && j<m)
  32. //i<n:arr1下标小于arr1长度,说明arr1还有值
  33. //j<m:arr2下标小于arr2长度,说明arr2还有值
  34. //两个数组都有值才用进行比较赋值
  35. {
  36. if (arr1[i] < arr2[j]) //arr1的值小于arr2的值
  37. {
  38. arr3[k] = arr1[i]; //把小的值赋给arr3
  39. //给值 和 被给值 的数组下标都用往后移
  40. k++;
  41. i++;
  42. }
  43. else //等于时放谁都一样 或 arr2变得比较小了
  44. {
  45. arr3[k] = arr2[j]; //把小的值赋给arr3
  46. //给值 和 被给值 的数组下标都用往后移
  47. k++;
  48. j++;
  49. }
  50. }
  51. return 0;
  52. }

实现图片:

改正:“46行”和“53行注释中的值……”改为=>"的值……")

                 


                 

第三步:

进行完(二)中的步骤后,

跳出循环说明有一个数组已经遍历完了

此时 i、j、k 下标都已经移动到了合适的位置

           

(1). 先判断是哪个数组遍历完了

如果 i == n,说明是 arr1 遍历完了,则把 arr2 中剩余的元素全部放入 arr3 中;

其它情况(j == m),说明是 arr2 遍历完了,则把 arr1 中剩余的元素全部放入 arr3 中。

              

(2). 进行打印

                     

实现代码:

  1. #include <stdio.h>
  2. int main() {
  3. //输入 n 和 m
  4. int n = 0;
  5. int m = 0;
  6. scanf("%d %d", &n, &m);
  7. //定义变长数组:
  8. int arr1[n];
  9. int arr2[m];
  10. //对变长数组进行赋值
  11. int i = 0;
  12. for (i = 0; i < n; i++)
  13. //前面输入的n就是arr1的长度
  14. {
  15. scanf("%d", &arr1[i]);
  16. }
  17. i = 0;
  18. for (i = 0; i < m; i++)
  19. //前面输入的m就是arr1的长度
  20. {
  21. scanf("%d", &arr2[i]);
  22. }
  23. //开始合并:
  24. //定义第三个变长数组arr3,存放两arr1 和 arr2合并后的结果:
  25. int arr3[n + m]; //变长数组不能初始化
  26. //定义三个变长数组的下标:
  27. i = 0; //arr1下标
  28. int j = 0; //arr2下标
  29. int k = 0; //arr3下标
  30. //使用 while循环,
  31. while (i < n && j < m)
  32. //i<n:arr1下标小于arr1长度,说明arr1还有值
  33. //j<m:arr2下标小于arr2长度,说明arr2还有值
  34. //两个数组都有值才用进行比较赋值
  35. {
  36. if (arr1[i] < arr2[j]) //arr1的值小于arr2的值
  37. {
  38. arr3[k] = arr1[i]; //把大的值赋给arr3
  39. //给值 和 被给值 的数组下标都用往后移
  40. k++;
  41. i++;
  42. }
  43. else //等于时放谁都一样 或 arr2变得比较小了
  44. {
  45. arr3[k] = arr2[j]; //把大的值赋给arr3
  46. //给值 和 被给值 的数组下标都用往后移
  47. k++;
  48. j++;
  49. }
  50. }
  51. //跳出循环说明有一个数组已经被遍历完了
  52. //此时,i、j、k 都已经移动到了合适的位置
  53. //判断哪个数组遍历完了进行操作:
  54. if (i == n) //arr1下标等于arr1数组长度,说明arr1遍历完了
  55. {
  56. //将arr2中剩余的元素全部放入arr3中:
  57. while (j < m)//arr2下标小于arr2数组长度就继续放
  58. {
  59. arr3[k] = arr2[j];
  60. k++;
  61. j++;
  62. }
  63. }
  64. else //arr2遍历完
  65. {
  66. //将arr1中剩余的元素全部放入arr3中:
  67. while (i < n)//arr1下标小于arr1数组长度就继续放
  68. {
  69. arr3[k] = arr1[i];
  70. k++;
  71. i++;
  72. }
  73. }
  74. //进行打印:
  75. for (i = 0; i < n + m; i++)
  76. {
  77. printf("%d ", arr3[i]);
  78. }
  79. return 0;
  80. }

实现图片:

                    

最终代码和实现效果

最终代码:

  1. #include <stdio.h>
  2. int main() {
  3. //输入 n 和 m
  4. int n = 0;
  5. int m = 0;
  6. scanf("%d %d", &n, &m);
  7. //定义变长数组:
  8. int arr1[n];
  9. int arr2[m];
  10. //对变长数组进行赋值
  11. int i = 0;
  12. for (i = 0; i < n; i++)
  13. //前面输入的n就是arr1的长度
  14. {
  15. scanf("%d", &arr1[i]);
  16. }
  17. i = 0;
  18. for (i = 0; i < m; i++)
  19. //前面输入的m就是arr1的长度
  20. {
  21. scanf("%d", &arr2[i]);
  22. }
  23. //开始合并:
  24. //定义第三个变长数组arr3,存放两arr1 和 arr2合并后的结果:
  25. int arr3[n + m]; //变长数组不能初始化
  26. //定义三个变长数组的下标:
  27. i = 0; //arr1下标
  28. int j = 0; //arr2下标
  29. int k = 0; //arr3下标
  30. //使用 while循环,
  31. while (i < n && j < m)
  32. //i<n:arr1下标小于arr1长度,说明arr1还有值
  33. //j<m:arr2下标小于arr2长度,说明arr2还有值
  34. //两个数组都有值才用进行比较赋值
  35. {
  36. if (arr1[i] < arr2[j]) //arr1的值小于arr2的值
  37. {
  38. arr3[k] = arr1[i]; //把大的值赋给arr3
  39. //给值 和 被给值 的数组下标都用往后移
  40. k++;
  41. i++;
  42. }
  43. else //等于时放谁都一样 或 arr2变得比较小了
  44. {
  45. arr3[k] = arr2[j]; //把大的值赋给arr3
  46. //给值 和 被给值 的数组下标都用往后移
  47. k++;
  48. j++;
  49. }
  50. }
  51. //跳出循环说明有一个数组已经被遍历完了
  52. //此时,i、j、k 都已经移动到了合适的位置
  53. //判断哪个数组遍历完了进行操作:
  54. if (i == n) //arr1下标等于arr1数组长度,说明arr1遍历完了
  55. {
  56. //将arr2中剩余的元素全部放入arr3中:
  57. while (j < m)//arr2下标小于arr2数组长度就继续放
  58. {
  59. arr3[k] = arr2[j];
  60. k++;
  61. j++;
  62. }
  63. }
  64. else //arr2遍历完
  65. {
  66. //将arr1中剩余的元素全部放入arr3中:
  67. while (i < n)//arr1下标小于arr1数组长度就继续放
  68. {
  69. arr3[k] = arr1[i];
  70. k++;
  71. i++;
  72. }
  73. }
  74. //进行打印:
  75. for (i = 0; i < n + m; i++)
  76. {
  77. printf("%d ", arr3[i]);
  78. }
  79. return 0;
  80. }

实现效果:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/417382
推荐阅读
相关标签
  

闽ICP备14008679号