EP06. “Sort Numbers 冒泡排序数字”
🔒 登录后可标记已读- 这篇用 VBA 手写一个「冒泡排序」(Bubble Sort)算法,把一列数字从小到大排好
- 前置知识:双层
For循环和If Then判断 - 学完能理解排序算法最基础的思路——两两比较、不符合顺序就交换
- 也会看到 Excel 内建的
Sort方法,实务上更常用
重点内容
适用版本
桌面版通用(Excel 365 / 2021 / 2019 等)。
完整 VBA 代码(冒泡排序)
Dim i As Integer, j As Integer, temp As Integer, rng As Range
Set rng = Range("A1").CurrentRegion
For i = 1 To rng.Count
For j = i + 1 To rng.Count
If rng.Cells(j) < rng.Cells(i) Then
'swap numbers
temp = rng.Cells(i)
rng.Cells(i) = rng.Cells(j)
rng.Cells(j) = temp
End If
Next j
Next i
代码说明
- 声明
i、j(双层循环计数器)、temp(交换用的临时变量)、rng(要排序的范围) - 用
Range("A1").CurrentRegion自动抓取 A1 所在的连续数据区域,不用手动写死范围地址,数据有多少行都能自动适应 - 外层循环
i从 1 到rng.Count(范围内单元格总数),内层循环j从i + 1开始,让每一对数字只比较一次 If rng.Cells(j) < rng.Cells(i) Then判断后面的数字是否比前面小,如果是就要交换位置- 用
temp当中转站完成交换:先把rng.Cells(i)存进temp,再把rng.Cells(j)的值写进rng.Cells(i),最后把temp(原本i的值)写进rng.Cells(j)——三步缺一不可,直接互相赋值会导致其中一个值被覆盖丢失 - 双层循环跑完,整个范围就会是从小到大排好的结果
怎么运行
在 A1 开始的连续区域填入一组数字(比如 9 个数字),Alt + F11 打开 VBA 编辑器执行代码(或点命令按钮),这组数字会被排序成从小到大。
[截图:运行冒泡排序前后 A 列数字的对比,原本乱序的数字变成从小到大排列]
更简单的替代写法:内建 Sort 方法
不用自己写循环,也可以直接调用 Range.Sort:
Range("A1:A9").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlNo
Key1 指定排序依据的列,Order1:=xlAscending 表示升序,Header:=xlNo 表示数据不含标题行。实务上排序数字优先用这个内建方法,自己写冒泡排序主要是用来练习循环逻辑。
方法怎么选
| 写法 | 适合场景 | 备注 |
|---|---|---|
| 手写冒泡排序 | 想练习循环逻辑,或有自定义的排序规则 | 双层循环,数据量大时效率低(O(n²)) |
内建 Range.Sort | 只是想把数据排序 | 一行搞定,实务上优先用这个 |
学完你会
- ✅ 会用双层循环 + 临时变量交换,写出冒泡排序
- ✅ 会用
CurrentRegion自动抓取连续数据区域 - ✅ 会用内建
Range.Sort快速排序,不用自己写循环
常见错误
- 交换两个值时漏了
temp这个中转变量,直接写rng.Cells(i) = rng.Cells(j)再rng.Cells(j) = rng.Cells(i),第二步执行时rng.Cells(i)已经被第一步覆盖,交换会失败 - 内层循环写成
For j = 1 To rng.Count而不是For j = i + 1 To rng.Count,会让每一对数字被重复比较、多做很多不必要的运算 - 冒泡排序在数据量很大时效率低(是 O(n²) 算法),如果只是要排序数据,实务上应该优先用内建
Sort方法,手写循环只适合练习或有特殊排序逻辑需求的场景
Sources
Blog / Website: