冒泡排序
注意点
- 越界问题:i的边界是n-1,也就是说是对总共的第1~n个数进行排列(最后一个数处于被比较状态,不需要额外主动比较);j的初始值或最终值与当前i的值
有关题目中往往会改变i的值来考察,拿j的值来填空
- 升降序问题:取决于j循环与if比较
- 循环次数:n-1 两两比较次数:n(n-1)/2
初级代码
| For i=1 to n-1 |
| For j= n to i+1 step -1 |
| If d(j)<d(j-1) then |
| t=d(j): d(j)=d(j-1):d(j-1)=t |
| End If |
| Next j |
| Next i |
变式
原理:先立一个flag,如果当前这遍循环中有进行过交换,则改变flag的值;如果一直没有进行交换,即数列已有序,则退出循环
| For i=1 to n-1 |
| flag=true |
| For j= n to i+1 step -1 |
| If d(j)<d(j-1) then |
| t=d(j): d(j)=d(j-1):d(j-1)=t |
| flag=false |
| End If |
| Next j |
| if flag=true then Exit For |
| Next i |
原理:基于遍数优化版本上的再次优化(遍数优化当然可以修改成do while形式的)。last用于锁定最近且最后一次修改的地方,flag效果同遍数优化。下一次循环只需要遍历last~n之间的数字即可。
| Do while flag=true |
| last=1:flag=true |
| For j= n to last+1 step -1 |
| If d(j)<d(j-1) then |
| t=d(j): d(j)=d(j-1):d(j-1)=t |
| m=j |
| flag=false |
| End If |
| Next j |
| last=m |
| Loop |
原理:说白了就是一个升序一个降序的俩普通冒泡并在一起,但是一个从头一个从尾开始遍历。由于内部的for是并列的,所以粗略地看,时间复杂度并没有变化,但却将比较遍数缩小成其1/2。个人觉得只适用于n为偶数的情况,
因为如果像下面的代码一样,中间必有一个孤儿没有排到。(visual basic中的/是向上取整,\是向下取整)
| For i=1 to n/2 |
| For j= n-i+1 to i+1 step -1 |
| If d(j)<d(j-1) then |
| t=d(j):d(j)=d(j-1):d(j-1)=t |
| End If |
| Next j |
| For j= i+1 to n-i step -1 |
| If d(j)<d(j+1) then |
| t=d(j):d(j)=d(j-1):d(j-1)=t |
| End If |
| Next j |
| Next i |
下面这个是第一种单层循环冒泡,来自于老师的PPT,不大理解
| Do While i <= n |
| If i=0 or a(i-1)<=a(i) Then |
| i=i+1 |
| Else i<>0 And a(i-1)>a(i) |
| t=a(i-1):a(i-1)=a(i):a(i)=t |
| i=i-1 |
| End If |
| Loop |
| |
原理:若该趟for循环结束将给i赋值-1,并且将team的长度减1,继续下趟循环
下面这个思路来源于这条博客,将c++改成了visual basic
| team=n-1 |
| For i=0 To team |
| If a(i)>a(i+1) Then |
| t=a(i):a(i)=a(i+1):a(i+1)=t |
| End If |
| If i=team-1 Then |
| i=-1:team=team-1 |
| End If |
| Next i |
【推荐】2025 HarmonyOS 鸿蒙创新赛正式启动,百万大奖等你挑战
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET MAUI项目中绑定Android库实现硬件控制的开发经历
· 糊涂啊!这个需求居然没想到用时间轮来解决
· 浅谈为什么我讨厌分布式事务
· 在 .NET 中使用内存映射文件构建高性能的进程间通信队列
· 一个 java 空指针异常的解决过程
· 干翻 Typora!MilkUp:完全免费的桌面端 Markdown 编辑器!
· 那些年我们一起追过的Java技术,现在真的别再追了!
· 记一次.NET MAUI项目中绑定Android库实现硬件控制的开发经历
· 从WebApi迁移到Minimal API?有了这个神器,小白也能10分钟搞定!
· 抛开官方库,手撸一个轻量级 MCP 服务端