陣列排序系列(2)
阿新 • • 發佈:2018-12-10
極值法(選擇法)
與冒泡法類似,這個演算法也是採用雙重迴圈的結構來調整陣列元素順序,進而實現數值排序。
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個數組元素與極值(第4個數組元素)進行互換,如下圖所示。
第2次內層迴圈執行結束之後,第2個最小值8已經在第2個數組元素的位置,因此不需要進行位置調整。
依次類推繼續調整第n個極值的位置。
… …
外層迴圈執行9次之後,完成全部陣列排序,此時陣列值如I-9
行。
此示例程式碼實現的是升序排序,如下需要使用降序排序,那麼只需要修改第20行程式碼如下。
If aintData(j) > intMin Then