宇哥教你用VBA玩转冒泡排序
创作时间:
作者:
@小白创作中心
宇哥教你用VBA玩转冒泡排序
引用
CSDN
等
7
来源
1.
https://blog.csdn.net/hhhhh_51/article/details/124333750
2.
https://blog.csdn.net/qq_39660799/article/details/120269387
3.
https://blog.csdn.net/m0_74737305/article/details/133846021
4.
https://blog.csdn.net/aaron19822007/article/details/124647770
5.
https://club.excelhome.net/thread-1486048-1-1.html
6.
http://www.360doc.com/content/22/0215/15/78635869_1017513964.shtml
7.
https://club.excelhome.net/forum.php?mod=viewthread&tid=118580&extra=page%3D1&mobile=2
在Excel数据处理中,排序是一个常见的需求。虽然Excel本身提供了排序功能,但在某些情况下,我们可能需要通过VBA代码来实现更复杂的排序逻辑。今天,我们就来学习如何用VBA实现经典的冒泡排序算法。
01
冒泡排序原理
冒泡排序是一种简单的排序算法,其基本思想是通过重复遍历待排序的列表,比较相邻元素,如果顺序错误就交换他们,直到没有需要交换的元素为止。这个过程类似于水中的气泡逐渐上浮,因此得名“冒泡排序”。
具体步骤如下:
- 从第一个元素开始,比较相邻的两个元素,如果前一个元素大于后一个元素,则交换它们的位置。
- 重复上述过程,直到最后一个元素。
- 完成一轮比较后,最大的元素会被“冒泡”到正确的位置。
- 重复上述过程,但每次可以减少比较的次数,因为每轮结束后,最后一个元素已经是正确的。
02
VBA代码实现
下面是一个完整的VBA代码示例,实现了冒泡排序算法:
Sub BubbleSort()
Dim arr As Variant
Dim i As Long, j As Long
Dim temp As Variant
' 示例数组(可根据需要修改)
arr = Array(5, 3, 8, 6, 2, 7, 1, 4)
' 外层循环控制遍历次数
For i = LBound(arr) To UBound(arr) - 1
' 内层循环进行相邻元素比较
For j = LBound(arr) To UBound(arr) - i - 1
If arr(j) > arr(j + 1) Then
' 交换元素
temp = arr(j)
arr(j) = arr(j + 1)
arr(j + 1) = temp
End If
Next j
Next i
' 输出排序结果到调试窗口
For i = LBound(arr) To UBound(arr)
Debug.Print arr(i)
Next i
End Sub
03
代码解析
数组声明和初始化:
Dim arr As Variant:声明一个变体类型的数组。arr = Array(5, 3, 8, 6, 2, 7, 1, 4):初始化数组,这里使用了一个示例数组。
外层循环:
For i = LBound(arr) To UBound(arr) - 1:控制遍历次数。LBound和UBound函数分别获取数组的最小和最大索引。
内层循环:
For j = LBound(arr) To UBound(arr) - i - 1:进行相邻元素的比较。每次外层循环后,最大的元素会被“冒泡”到正确位置,因此内层循环的范围可以逐渐减小。
元素交换:
If arr(j) > arr(j + 1) Then:如果前一个元素大于后一个元素。temp = arr(j),arr(j) = arr(j + 1),arr(j + 1) = temp:通过临时变量temp完成元素交换。
输出结果:
Debug.Print arr(i):将排序后的数组元素输出到VBA调试窗口。
04
实际应用
在实际工作中,我们通常需要对Excel工作表中的数据进行排序。下面是一个示例,演示如何从工作表中读取数据,进行排序后再输出:
Sub SortWorksheetData()
Dim ws As Worksheet
Dim arr As Variant
Dim lastRow As Long
Dim i As Long, j As Long
Dim temp As Variant
' 设置工作表
Set ws = ThisWorkbook.Sheets("Sheet1")
' 获取数据区域的最后一行
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' 将数据读取到数组
arr = ws.Range("A1:A" & lastRow).Value
' 冒泡排序
For i = LBound(arr) To UBound(arr) - 1
For j = LBound(arr) To UBound(arr) - i - 1
If arr(j, 1) > arr(j + 1, 1) Then
temp = arr(j, 1)
arr(j, 1) = arr(j + 1, 1)
arr(j + 1, 1) = temp
End If
Next j
Next i
' 将排序后的数据写回工作表
ws.Range("B1:B" & lastRow).Value = arr
End Sub
在这个示例中:
- 从工作表的A列读取数据到数组
- 使用冒泡排序算法对数组进行排序
- 将排序后的数据输出到B列
05
注意事项
- 数组索引:VBA数组的索引默认从0开始,但可以通过
Option Base 1语句改为从1开始。 - 数据类型:确保数组中的数据类型一致,避免在比较和交换时出现错误。
- 性能考虑:冒泡排序的时间复杂度为O(n²),对于大数据量的排序效率较低。在实际应用中,如果数据量较大,可以考虑使用更高效的排序算法。
通过以上步骤,你就可以在Excel中使用VBA实现冒泡排序了。虽然冒泡排序不是最高效的排序算法,但它简单易懂,非常适合初学者学习和掌握。
热门推荐
同济医院完成多例复杂性ERCP手术,为胰腺癌患者带来新希望
清明节加班工资怎么算
如何分辨經典台灣腔?從語音、詞彙到文化特色全解析
让城市有“里子”更有“面子” 多地地下管网改造按下“加速键”
车祸死亡:重演悲剧,关注交通安全
如何提高项目细节管理
大型集团财务共享服务中心规划项目方案
全国有多少种“冬枣”?哪个品种最好吃?今天全读懂,来涨知识了
B淋巴细胞低是什么原因
前间壁心肌梗死的症状及应对方法
阿里云盘分享如何搜索链接
录音录像取证需要注意的问题有哪些
内容为王:打造高质量内容以提升SEO效果
十字架的冷历史:从刑具到信仰象征的演变
真十字架:基督教信仰中的神圣遗物与历史传说
罗马帝国的扩张与文化传播:初中历史知识点详解
婚礼消费新趋势调查:理性简约成潮流,新中式风格圈粉
考心理咨询师有学历要求吗
孕妇不宜服用灭吐灵,维生素B6
到底是“大器晚成”还是“大器免成”?
人去楼空!昆明一健身机构突然关门,有人刚交了费一节课都没上
知名亲子游泳培训机构卷款跑路
新刊速读 | 城商行投贷联动业务发展路径浅析——基于认股选择权贷款的论证
拯救隔夜饭!教你重现实煮米饭的美味口感
咖啡致癌?转基因致癌?有机食品防癌?权威机构给出答案
六偏磷酸钠放在牛奶里是什么作用
直线导轨的承载能力如何?
运动时,心率多少算“正常”?超过这个数就需要格外关注!
大肠癌一确诊就是中晚期?警惕这些大肠的求助信号
NBT:生物信息平台DRAGEN可30分钟完成大规模全基因组分析和多种变异检测