#### 极值法(选择法)
与冒泡法类似,这个算法也是采用双重循环的结构来调整数组元素顺序,进而实现数值排序。
Sub SelectionSort()
Dim aintData(1 To 10) As Variant
Dim i As Integer
Dim j As Integer
Dim intLB As Integer
Dim intUB As Integer
Dim intTemp As Integer
Dim intIndex As Integer
Dim intMin As Integer
intLB = LBound(aintData)
intUB = UBound(aintData)
For i = intLB To intUB
aintData(i) = Application.WorksheetFunction.RandBetween(1, 100)
Next i
Debug.Print "Original Data: " & Join(aintData, ",")
For i = intLB To intUB - 1
intIndex = i
intMin = aintData(i)
For j = i + 1 To intUB
If aintData(j) < intMin Then
intIndex = j
intMin = aintData(j)
End If
Next j
If intIndex > i Then
intTemp = aintData(i)
aintData(i) = aintData(intIndex)
aintData(intIndex) = intTemp
End If
Next i
Debug.Print "After Sort: " & Join(aintData, ",")
End Sub
运行代码结果如下。
Original Data: 72,8,53,2,38,51,39,63,77,33
After Sort: 2,8,33,38,39,51,53,63,72,77
代码解析:
对于与冒泡法相同的代码部分,不再进行解释,请参考 数组排序系列(1)。
极值法中内层循环(第19行到第24行代码)实现查找第n个极值(最大值或最小值)。为了实现升序排列,第一次运行内层循环将查找第1个极值(即最小值),数值保存在变量intMin
中,极值的位置保存在变量intIndex
中。
内层循环运行结束之后,如果变量intIndex
的值与变量i
不相同,那么第26行到第28行代码将当前数组元素(第i个数组元素,即第1个数组元素)与极值(第4个数组元素)进行互换,如下图所示。
第2次内层循环运行结束之后,第2个最小值8
已经在第2个数组元素的位置,因此不需要进行位置调整。
依次类推继续调整第n个极值的位置。
… …
外层循环运行9次之后,完成全部数组排序,此时数组值如I-9
行。
此示例代码实现的是升序排序,如需使用降序,那么只需要修改第20行代码如下。
If aintData(j) > intMin Then
相关文章链接:
数组排序系列(1)-- 冒泡法
数组排序系列(2)-- 极值法
数组排序系列(3)-- 工作表排序法
数组排序系列(4)-- JavaScript排序法(数字升序)
数组排序系列(5)-- JavaScript排序法(数字降序)
数组排序系列(6)-- JavaScript排序法(字符排序)