排序算法之——冒泡排序
1.算法思想(参考:https://www.cnblogs.com/nicaicai/p/12549959.html)
通过对待排序的序列从前向后依次比较相邻元素的值,如果发现逆序则交换。
逆序的含义:如果想把序列从小到大排序,那么两个数中前面的比后面的大就是逆序。
若需求是将序列从小到大排序,那么每一趟比较都会把值较大的逐渐从前面移动到后面。
2.冒泡排序的C语言实现
(1)排序的总趟数和每趟排序数组元素的比较次数都设置为数组大小n-1,排序的比较次数为(n-1)*(n-1)次
//冒泡排序 #include <stdio.h> int main() { //定义一个整型数组 int a[]={9,8,3,5,2,10,7}; int i,j,n; //整个数组的大小除以第一个数组元素的大小 ,得到数组的长度 n=sizeof(a)/sizeof(a[0]); //排序前的数组 printf("排序前:"); for(i=0;i<n;i++) { printf("a[%d]=%d ",i,a[i]); } for(i=0;i<n-1;i++) //排序的总趟数,等于数组大小-1 { for(j=0;j<n-1;j++) //每一趟数组元素的比较次数 { /*如果前一个数组元素比之后一个数组元素大,则交换它们的位置*/ if(a[j]>a[j+1]) { int temp; temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } } printf("\n"); //排序后的数组 printf("排序后:"); for(i=0;i<n;i++) { printf("a[%d]=%d ",i,a[i]); } return 0; }
运行结果:
(2)改进的冒泡排序算法,每趟排序的总比较次数依次减1,已经排序好的数组元素不再参与每趟排序的比较,最坏的情况下比较次数为n-1+n-2.........+1=n*(n-1)/2次。
//冒泡排序 #include <stdio.h> int main() { //定义一个整型数组 int a[]={9,8,3,5,2}; int i,j; //排序前的数组 printf("排序前:"); for(i=0;i<5;i++) { printf("a[%d]=%d ",i,a[i]); } for(i=0;i<5-1;i++) //排序的总趟数,等于数组大小-1 { for(j=0;j<5-1-i;j++) //每一趟数组元素的比较次数 { if(a[j]>a[j+1]) { int temp; temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } } printf("\n"); //排序后的数组 printf("排序后:"); for(i=0;i<5;i++) { printf("a[%d]=%d ",i,a[i]); } return 0; }
运行结果:
参考文章:
http://c.biancheng.net/view/6506.html
https://www.cnblogs.com/nicaicai/p/12549959.html
转载文章链接已标明,如有侵权请告知。文章仅作为知识记忆所用,如有错误,敬请指正。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?