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

发布时间:2026/6/23 22:55:21
C语言学习笔记20260615-有序升序序列合并 C语言学习笔记20260615-有序升序序列合并要求输入两个升序排列的整数序列元素个数分别为m、n将两个序列合并为一个新的升序序列并完整输出。方法一双指针合并法推荐高效算法思路两个原始数组本身已经升序使用双指针同时遍历两个数组分别用指针指向两个数组起始位置依次对比两个指针指向的元素将较小值存入结果数组并移动对应指针其中一个数组遍历完成后直接把另一个数组剩余元素全部追加到结果末尾优势利用原有有序特性无需二次排序执行效率最高。完整代码#define_CRT_SECURE_NO_WARNINGS#includestdio.h#defineMAX_LEN100// 定义数组最大容量intmain(){intarr1[MAX_LEN],arr2[MAX_LEN];intres[MAX_LEN*2];// 存储合并后的结果数组intm,n;// m、n 分别为两个序列的元素个数inti0,j0,k0;// i遍历arr1j遍历arr2k遍历结果数组// 输入第一个升序序列printf(请输入第一个序列元素个数 m);scanf(%d,m);printf(请输入 %d 个升序整数,m);for(i0;im;i){scanf(%d,arr1[i]);}// 输入第二个升序序列printf(请输入第二个序列元素个数 n);scanf(%d,n);printf(请输入 %d 个升序整数,n);for(j0;jn;j){scanf(%d,arr2[j]);}// 重置指针开始合并i0;j0;// 同时遍历两个数组取较小元素放入结果数组while(imjn){if(arr1[i]arr2[j]){res[k]arr1[i];}else{res[k]arr2[j];}}// 处理arr1中剩余元素while(im){res[k]arr1[i];}// 处理arr2中剩余元素while(jn){res[k]arr2[j];}// 输出合并后的升序序列printf(合并后的升序序列);for(intt0;tmn;t){printf(%d ,res[t]);}printf(\n);return0;}方法二数组拼接 冒泡排序法入门易懂算法思路1.先将两个数组完整拼接到同一个新数组中2.对拼接完成的整体数组执行冒泡排序得到升序结果3.无需理解双指针逻辑纯基础循环实现适合新手学习。完整代码#define_CRT_SECURE_NO_WARNINGS#includestdio.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(i0;im;i){scanf(%d,arr1[i]);res[i]arr1[i];}// 输入第二个序列拼接到结果数组后半段printf(请输入第二个序列元素个数 n);scanf(%d,n);printf(请输入 %d 个升序整数,n);for(i0;in;i){scanf(%d,arr2[i]);res[mi]arr2[i];}inttotalmn;// 合并后总元素数量// 冒泡排序对整体数组升序排序for(i0;itotal-1;i){for(j0;jtotal-1-i;j){// 前大于后则交换位置if(res[j]res[j1]){inttempres[j];res[j]res[j1];res[j1]temp;}}}// 输出结果printf(合并后的升序序列);for(i0;itotal;i){printf(%d ,res[i]);}printf(\n);return0;}方法三原地拼接排序节省额外数组空间算法思路1.假设第一个数组空间充足可容纳两组所有数据2.将第二个数组直接拼接到第一个数组尾部3.对拼接完成的原数组做冒泡排序实现升序4.不新建独立结果数组最大化节省内存空间。完整代码#define_CRT_SECURE_NO_WARNINGS#includestdio.h#defineMAX_LEN200// 数组长度预留足够空间存放两组数据intmain(){intarr1[MAX_LEN],arr2[MAX_LEN];intm,n;inti,j;// 输入第一个升序序列printf(请输入第一个序列元素个数 m);scanf(%d,m);printf(请输入 %d 个升序整数,m);for(i0;im;i){scanf(%d,arr1[i]);}// 输入第二个序列并拼接到 arr1 尾部printf(请输入第二个序列元素个数 n);scanf(%d,n);printf(请输入 %d 个升序整数,n);for(i0;in;i){scanf(%d,arr2[i]);arr1[mi]arr2[i];}inttotalmn;// 冒泡排序整体数组for(i0;itotal-1;i){for(j0;jtotal-1-i;j){if(arr1[j]arr1[j1]){inttemparr1[j];arr1[j]arr1[j1];arr1[j1]temp;}}}// 输出最终合并结果printf(合并后的升序序列);for(i0;itotal;i){printf(%d ,arr1[i]);}printf(\n);return0;}