当前位置: 首页 > news >正文

C语言学习笔记20260615-有序升序序列合并

C语言学习笔记20260615-有序升序序列合并

要求

输入两个升序排列的整数序列,元素个数分别为mn;将两个序列合并为一个新的升序序列,并完整输出。


方法一:双指针合并法(推荐,高效)

算法思路

两个原始数组本身已经升序,使用双指针同时遍历两个数组:

  1. 分别用指针指向两个数组起始位置;
  2. 依次对比两个指针指向的元素,将较小值存入结果数组,并移动对应指针;
  3. 其中一个数组遍历完成后,直接把另一个数组剩余元素全部追加到结果末尾;
  4. 优势:利用原有有序特性,无需二次排序,执行效率最高。

完整代码

#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#defineMAX_LEN100// 定义数组最大容量intmain(){intarr1[MAX_LEN],arr2[MAX_LEN];intres[MAX_LEN*2];// 存储合并后的结果数组intm,n;// m、n 分别为两个序列的元素个数inti=0,j=0,k=0;// i遍历arr1,j遍历arr2,k遍历结果数组// 输入第一个升序序列printf("请输入第一个序列元素个数 m:");scanf("%d",&m);printf("请输入 %d 个升序整数:",m);for(i=0;i<m;i++){scanf("%d",&arr1[i]);}// 输入第二个升序序列printf("请输入第二个序列元素个数 n:");scanf("%d",&n);printf("请输入 %d 个升序整数:",n);for(j=0;j<n;j++){scanf("%d",&arr2[j]);}// 重置指针,开始合并i=0;j=0;// 同时遍历两个数组,取较小元素放入结果数组while(i<m&&j<n){if(arr1[i]<arr2[j]){res[k++]=arr1[i++];}else{res[k++]=arr2[j++];}}// 处理arr1中剩余元素while(i<m){res[k++]=arr1[i++];}// 处理arr2中剩余元素while(j<n){res[k++]=arr2[j++];}// 输出合并后的升序序列printf("合并后的升序序列:");for(intt=0;t<m+n;t++){printf("%d ",res[t]);}printf("\n");return0;}

方法二:数组拼接 + 冒泡排序法(入门易懂)

算法思路

1.先将两个数组完整拼接到同一个新数组中;

2.对拼接完成的整体数组执行冒泡排序,得到升序结果;

3.无需理解双指针逻辑,纯基础循环实现,适合新手学习。

完整代码

#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#defineMAX_LEN100intmain(){intarr1[MAX_LEN],arr2[MAX_LEN],res[MAX_LEN*2];intm,n;inti,j;// 输入第一个序列并存入结果数组前半段printf("请输入第一个序列元素个数 m:");scanf("%d",&m);printf("请输入 %d 个升序整数:",m);for(i=0;i<m;i++){scanf("%d",&arr1[i]);res[i]=arr1[i];}// 输入第二个序列,拼接到结果数组后半段printf("请输入第二个序列元素个数 n:");scanf("%d",&n);printf("请输入 %d 个升序整数:",n);for(i=0;i<n;i++){scanf("%d",&arr2[i]);res[m+i]=arr2[i];}inttotal=m+n;// 合并后总元素数量// 冒泡排序:对整体数组升序排序for(i=0;i<total-1;i++){for(j=0;j<total-1-i;j++){// 前大于后则交换位置if(res[j]>res[j+1]){inttemp=res[j];res[j]=res[j+1];res[j+1]=temp;}}}// 输出结果printf("合并后的升序序列:");for(i=0;i<total;i++){printf("%d ",res[i]);}printf("\n");return0;}

方法三:原地拼接排序(节省额外数组空间)

算法思路

1.假设第一个数组空间充足,可容纳两组所有数据;

2.将第二个数组直接拼接到第一个数组尾部;

3.对拼接完成的原数组做冒泡排序,实现升序;

4.不新建独立结果数组,最大化节省内存空间。

完整代码

#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#defineMAX_LEN200// 数组长度预留足够空间,存放两组数据intmain(){intarr1[MAX_LEN],arr2[MAX_LEN];intm,n;inti,j;// 输入第一个升序序列printf("请输入第一个序列元素个数 m:");scanf("%d",&m);printf("请输入 %d 个升序整数:",m);for(i=0;i<m;i++){scanf("%d",&arr1[i]);}// 输入第二个序列,并拼接到 arr1 尾部printf("请输入第二个序列元素个数 n:");scanf("%d",&n);printf("请输入 %d 个升序整数:",n);for(i=0;i<n;i++){scanf("%d",&arr2[i]);arr1[m+i]=arr2[i];}inttotal=m+n;// 冒泡排序整体数组for(i=0;i<total-1;i++){for(j=0;j<total-1-i;j++){if(arr1[j]>arr1[j+1]){inttemp=arr1[j];arr1[j]=arr1[j+1];arr1[j+1]=temp;}}}// 输出最终合并结果printf("合并后的升序序列:");for(i=0;i<total;i++){printf("%d ",arr1[i]);}printf("\n");return0;}
http://www.jsqmd.com/news/1069549/

相关文章:

  • RAG-9-Milvus介绍及多模态检索实践
  • 精密机械加工量产为何两难?精度和效率如何兼得?
  • 把 SAP PI/PO 通信通道变成可复用资产,从 Channel Template 到 Copy Existing Channel 的实战理解
  • 图像预处理全解|全网独家工况复盘 训练推理预处理对齐、畸变降噪自适应调优、定制流水线搭建、量产避坑指南、助力YOLO检测/OCR识别/工业缺陷/遥感分割全域提准提速
  • 计算机毕业设计之校园社团网络招聘系统
  • SQL练习题-基础查询、条件查询、高级查询、多表查询、常用函数练习题集合
  • 从零开始做一个高校课程资料 AI Agent 问答系统(三)上传资料全流程
  • 算法-k个一组翻转链表
  • 下班回家还要挑灯检查作业?这款AI作业批改工具,把家长从“修行”中解放了
  • LAC容器化授权困境(下篇):K8s环境下的授权锚定实战
  • 机器学习入门:逻辑回归原理、损失函数与梯度下降推导
  • C.3 DRM/TTM 灵魂拷问 100 问: 解释下 AMDGPU_GEM_CREATE_VRAM_CLEARED 标志的作用和实现原理
  • 计算机毕业设计之基于jsp新能源汽车租赁系统
  • 适合小白的嵌入式软件项目(C++)详解-----卡码缓存系统(二)实现最简单缓存
  • 新e选烤火罩异味[主面料] QB/T 4045—2010 5.8 判定符合检测标准与测试条件
  • 使用langchain4j遇到的难题(暂记)
  • 无人机电力营销落地瓶颈深度解析|四大核心壁垒、运维营销业务差异化、实景落地案例、全套YOLOv8电力AI视觉工程实现
  • 从零剖析十路充电桩嵌入式源码----软件开发环境搭建【3.1】
  • ivs-nat与nginx四层代理区别
  • eclipse设置豆沙绿背景色
  • 做 excel 表格用哪个智谱清言软件文档导出,AI 导出鸭专业适配表格导出,结构精准无需手动调整
  • 字符串的格式化问题 字符串的常规操作
  • deepspeed,vllm,llamafactory的使用
  • Kimi Work 来了:月之暗面发布桌面 Agent,知识工作者的“Vibe Working“时代开启
  • AI 时代,每个人都需要构建自己的操作系统
  • 【流形学习多模态语言变量分析基础】王阳明代数讲义之元认知透镜
  • 杰理ac791 wifi_camera 工程排坑手册
  • 云耀计算AI-Claura,在树莓派运行的AI
  • 【AI应用实战-WorkBuddy】工作流搭建:从需求到自动化全流程(十三)
  • 第二章 数字类型及其操作3