问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

宇哥教你用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

冒泡排序原理

冒泡排序是一种简单的排序算法,其基本思想是通过重复遍历待排序的列表,比较相邻元素,如果顺序错误就交换他们,直到没有需要交换的元素为止。这个过程类似于水中的气泡逐渐上浮,因此得名“冒泡排序”。

具体步骤如下:

  1. 从第一个元素开始,比较相邻的两个元素,如果前一个元素大于后一个元素,则交换它们的位置。
  2. 重复上述过程,直到最后一个元素。
  3. 完成一轮比较后,最大的元素会被“冒泡”到正确的位置。
  4. 重复上述过程,但每次可以减少比较的次数,因为每轮结束后,最后一个元素已经是正确的。
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

代码解析

  1. 数组声明和初始化

    • Dim arr As Variant:声明一个变体类型的数组。
    • arr = Array(5, 3, 8, 6, 2, 7, 1, 4):初始化数组,这里使用了一个示例数组。
  2. 外层循环

    • For i = LBound(arr) To UBound(arr) - 1:控制遍历次数。LBoundUBound函数分别获取数组的最小和最大索引。
  3. 内层循环

    • For j = LBound(arr) To UBound(arr) - i - 1:进行相邻元素的比较。每次外层循环后,最大的元素会被“冒泡”到正确位置,因此内层循环的范围可以逐渐减小。
  4. 元素交换

    • If arr(j) > arr(j + 1) Then:如果前一个元素大于后一个元素。
    • temp = arr(j), arr(j) = arr(j + 1), arr(j + 1) = temp:通过临时变量temp完成元素交换。
  5. 输出结果

    • 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

在这个示例中:

  1. 从工作表的A列读取数据到数组
  2. 使用冒泡排序算法对数组进行排序
  3. 将排序后的数据输出到B列
05

注意事项

  1. 数组索引:VBA数组的索引默认从0开始,但可以通过Option Base 1语句改为从1开始。
  2. 数据类型:确保数组中的数据类型一致,避免在比较和交换时出现错误。
  3. 性能考虑:冒泡排序的时间复杂度为O(n²),对于大数据量的排序效率较低。在实际应用中,如果数据量较大,可以考虑使用更高效的排序算法。

通过以上步骤,你就可以在Excel中使用VBA实现冒泡排序了。虽然冒泡排序不是最高效的排序算法,但它简单易懂,非常适合初学者学习和掌握。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号