[Visual Basic]冒泡排序及优化

冒泡排序

注意点

  • 越界问题: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 'new
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 'new
End If
Next j
if flag=true then Exit For 'new
Next i
  • 范围优化

原理:基于遍数优化版本上的再次优化(遍数优化当然可以修改成do while形式的)。last用于锁定最近且最后一次修改的地方,flag效果同遍数优化。下一次循环只需要遍历last~n之间的数字即可。

Do while flag=true 'new
last=1:flag=true 'new
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 'new
flag=false 'new
End If
Next j
last=m'new
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)'感觉这个else简直废话
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
posted @   一晌眠觉  阅读(147)  评论(0)    收藏  举报
编辑推荐:
· 记一次.NET MAUI项目中绑定Android库实现硬件控制的开发经历
· 糊涂啊!这个需求居然没想到用时间轮来解决
· 浅谈为什么我讨厌分布式事务
· 在 .NET 中使用内存映射文件构建高性能的进程间通信队列
· 一个 java 空指针异常的解决过程
阅读排行:
· 干翻 Typora!MilkUp:完全免费的桌面端 Markdown 编辑器!
· 那些年我们一起追过的Java技术,现在真的别再追了!
· 记一次.NET MAUI项目中绑定Android库实现硬件控制的开发经历
· 从WebApi迁移到Minimal API?有了这个神器,小白也能10分钟搞定!
· 抛开官方库,手撸一个轻量级 MCP 服务端
点击右上角即可分享
微信分享提示