vba 字典item按数值排序_冒泡排序


大家好,今日我们继续讲解VBA数组与字典解决方案,今日讲解第50讲:结合数组,在VBA中实现冒泡排序。对于排序,我们并不陌生,在之前的章节用也有介绍, 如在49讲中我们利用下面的代码实现了三重排序:

Range("A1:C" & Myrows).Sort Key1:=Range("a1"), Order1:=xlAscending, Key2:=Range( _

"b1"), Order2:=xlAscending, Key3:=Range("c1"), Order3:=xlDescending, _

Header:=xlYes

第一排序是Range("a1"),是升序,第二排序条件是Range("b1"),也是升序,第三排序条件是Range("c1"),是降序,上述的排序非常的简单明了。大家要好好掌握,但实际的工作中也有最为普通的排序要求。还有就是我们要理解排序的理论,我们今日讲解的是冒泡排序在VBA中的实现。在排序中,冒泡排序是最为基本的排序方法,我们可以借鉴这种思路。

实例:如下的数据:


vba 字典item按数值排序_vbnet 数组 临时存放_02


我们要把数据按工资多少进行排序,并把排序后的数据放在G列和H列,下面看代码:

Sub mynzsz_50() '第50讲 冒泡排序在VBA中的实现

Dim myarr As Variant

Sheets("50").Select

myarr = Range("a2:b" & Range("a2").End(xlDown).Row)

For i = UBound(myarr) To 1 Step -1

For j = 1 To i - 1

If myarr(j, 2) >= myarr(j + 1, 2) Then '比较相邻数据

Temp1 = myarr(j, 1)

Temp2 = myarr(j, 2)

myarr(j, 1) = myarr(j + 1, 1) '交换位置

myarr(j, 2) = myarr(j + 1, 2) '交换位置

myarr(j + 1, 1) = Temp1

myarr(j + 1, 2) = Temp2

End If

Next j

Next i

Range("g2").Resize(UBound(myarr), 2) = myarr

End Sub

代码截图:


vba 字典item按数值排序_数组_03


代码解析:

1 上述代码实现了数据冒泡排序。并把排序后的数据放在了G,H列。

2 myarr = Range("a2:b" & Range("a2").End(xlDown).Row)

将源数据放到数组中。

3 For i = UBound(myarr) To 1 Step -1

For j = 1 To i - 1

If myarr(j, 2) >= myarr(j + 1, 2) Then '比较相邻数据

Temp1 = myarr(j, 1)

Temp2 = myarr(j, 2)

myarr(j, 1) = myarr(j + 1, 1) '交换位置

myarr(j, 2) = myarr(j + 1, 2) '交换位置

myarr(j + 1, 1) = Temp1

myarr(j + 1, 2) = Temp2

End If

Next j

Next i

上述代码在数组中建立了两个循环,第一个循环是即外层的循环是数组的整体循环,是反方向来进行的,对于进入循环的每一个数值,开始内层的循环,在内层的循环中的作用就是交换位置,将每一个数值放到合适的位置,在交换位置的时候,要用两个变量把原位置的数暂时存放一下,然后交换,交换好后,将临时存放的数再放回到新的位置,要注意先下后上的原则。

4 Range("g2").Resize(UBound(myarr), 2) = myarr

上述代码将排好的数据回填到工作表中。

下面看代码的运行结果:


vba 字典item按数值排序_数据_04


今日内容回向:

1 如何理解冒泡排序?

2 冒泡排序在数组中是如何实现的?