1. 程式人生 > >陣列排序系列(2)

陣列排序系列(2)

極值法(選擇法)

與冒泡法類似,這個演算法也是採用雙重迴圈的結構來調整陣列元素順序,進而實現數值排序。

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