关于合并数组并排序的更优算法
本篇博客包括对原代码相关算法的改进以及完善,以及思想心得。
(1)博客介绍
来源:C语言,编写程序将两一维数组合并并排序 (baidu.com)
概要:合并两个数组并将其排序
(2)代码实现
原代码如下
#include <stdio.h> int main() { int n1,n2,i,j,t; int a[100],b[100],c[200]; //假设a,b为两有序数组且足够大 scanf("%d",&n1); for(i=0,j=0;i<n1;i++,j++) { scanf("%d",&a[i]); c[j]=a[i]; }//输入数组a,并且将其中的元素赋给数组c的前n1个元素 scanf("%d",&n2); for(i=0,j=n1;i<n2;i++,j++) { scanf("%d",&b[i]); c[j]=b[i]; }//输入数组b,并且将其中的元素赋给数组c的后n2个元素 for(i=0;i<n1+n2-1;i++) { for(j=0;j<n1+n2-1-i;j++) { if(c[j]>c[j+1]) { t=c[j]; c[j]=c[j+1]; c[j+1]=t; } } }//冒泡法,重新给数组c排序 for(j=0;j<n1+n2;j++) printf("%d ",c[j]); return 0; }
运行成功,截图如下:
(3)代码分析、设想
① 原代码通过设置三个数组,将两个数组首先合并在一个数组中,在使用冒泡法进行排序。冒泡排序法进行排序时,由运行测试数据可知:
第一趟第1次比较后的结果:2 5 1 7 4
第一趟第2次比较后的结果:2 1 5 7 4
第一趟第3次比较后的结果:2 1 5 7 4
第一趟第4次比较后的结果:2 1 5 4 7
第二趟第1次比较后的结果:1 2 5 4 7
第二趟第2次比较后的结果:1 2 5 4 7
第二趟第3次比较后的结果:1 2 4 5 7
第三趟第1次比较后的结果:1 2 4 5 7
第三趟第2次比较后的结果:1 2 4 5 7
第四趟第1次比较后的结果:1 2 4 5 7
从上面可知,从第二趟第 3次比较后,数组后面再进行的循环都是可以省略掉的。冒泡法平均时间复杂度为O(n*n),时间复杂度较高,当数据量较多时,效率慢。我想到,在数据结构的链表的学 习中,第一次做链表合并的题目的我也采用了冒泡排序算法进行对合并链表进行排序,后来学习到了一种更优、效率更高的递归合并方法,同样适用于数组的合并以及排序。
合并链表进行排序算法,首先需要输入有序数值链表,通过while循环比较两链表第一个数大小,取较小的数值放入新链表并将其指针向后移动一位,直到某条链表指针指向为空,再将有剩余的链 表接在 新链表后面,如下如所示,此算法时间复杂度为O(n),与冒泡法比较效率更高。
(2)且原代码未对输入全为0做处理;
(4)代码替换、结果展示
用上述算法进行对冒泡法排序的优化,并加上若输入全部为0的情况的处理,替换的代码如下
i=0; j=0; t=0; while(i<n1||j<n2) { if(a[i]<b[j]) { c[t++]=a[i++]; } else { c[t++]=b[j++]; } } while(j<n2) { c[t++]=b[j]; j++; } while(i<n1) { c[t++]=a[i++]; }
if((n1+n2)==0)
printf("空数组");
将此段代码替换掉冒泡排序后,运行结果如下
(5)思想心得
课程、时间有限,比多做题目本身更重要的是学会以一比三,融会贯通,算法思维比代码本身更加重要,多思考、多练习才能学的更好,走的更远,大家一起共勉。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~