宇哥教你用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实现冒泡排序了。虽然冒泡排序不是最高效的排序算法,但它简单易懂,非常适合初学者学习和掌握。
热门推荐
水产养殖新突破:胆汁酸可提高5%日增重,降低5%料肉比
北大医学团队发现新型胆汁酸修饰,揭示脂肪肝治疗新机制
胆汁酸代谢新发现:肠道菌群调控机制获揭示
日本放宽老年游客签证:3年多次往返,5天快速审批
超半数大学生零点后入睡,长期熬夜影响身心健康
——2024中国睡眠研究会白皮书
多地推行15分钟课间制,校长:拖堂、安全等难题如何破?
揭秘美国校园体育:三大运动如何塑造学生全面发展
安全舒适游北海道:老年人6天5夜全程攻略
亚龙湾:天下第一湾的绝美探秘
太行山大峡谷摄影大赛,你准备好了吗?
太行山大峡谷:打卡地质奇观的网红地
王莽岭:一个承载千年传说的太行明珠
太行山大峡谷徒步攻略:涉县最美线路详解
太行山大峡谷一日游攻略:三大景区特色详解
林定坤工作室推荐:泡脚方配合锻炼,轻松缓解足跟痛
办公室人群如何预防和缓解足跟痛?
足底筋膜炎的科学治疗指南
便携吉他:让音乐与你同行
弹吉他:开启身心健康的新篇章
十月自驾西藏:318国道成都至拉萨全程攻略
G219边境公路:多元地貌中的舒适露营地指南
高度近视患者献血有风险,专家建议600度以上者谨慎参与
高血压、高度近视患者不宜献血,医生详解风险原因
头晕口疮便秘?牛黄清胃丸帮你缓解胃火症状
牛黄清胃丸:清胃泻火功效好,孕妇禁用遵医嘱
“未病检测”成亮点,日本温泉旅游助力老年健康管理
富士山吉田路线:老年人轻松登顶,还有专业讲解服务
七成客户是老年人,这家旅行社如何精准满足银发族旅游需求
高纤维饮食增强免疫力,青少年这样预防灰指甲
清洁、剪指甲、均衡饮食:预防宝宝灰指甲全攻略