数组排序系列(2)

56 篇文章 4 订阅

#### 极值法(选择法)

与冒泡法类似,这个算法也是采用双重循环的结构来调整数组元素顺序,进而实现数值排序。

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排序法(字符排序)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值