畫面:
主程式:
Module ModuleDSW3 ' 自訂類別 Class NumOp ' 宣告陣列變數 Private NumArr() As Integer = Nothing ' 類別建構子 Public Sub New(NumOfArray As Integer) ReDim Me.NumArr(NumOfArray - 1) End Sub ' 賦值予指定陣列位址 Public Sub SetValue(Pos As Integer, Val As Integer) Me.NumArr(Pos) = Val End Sub ' 讀取指定陣列位址值 Public Function GetValue(Pos As Integer) As Integer Return Me.NumArr(Pos) End Function ' 賦予新陣列 Public Sub Assign(NewArray() As Integer) Me.NumArr = Nothing ReDim Me.NumArr(UBound(NewArray)) For i = 0 To UBound(NewArray) Me.NumArr(i) = NewArray(i) Next End Sub ' 列印陣列內容 Public Sub Print(Leading As String) Console.Write("{0}{1}", Leading, vbTab) For i = 0 To UBound(Me.NumArr) Console.Write("{0}{1}", Me.NumArr(i), vbTab) Next Console.WriteLine() End Sub ' 檢查 2 陣列位址值是否超出陣列範圍 Private Function CheckRange(Pos1 As Integer, Pos2 As Integer) As Boolean Return (Pos1 >= 0 And Pos2 >= 0) And (Pos1 <= UBound(Me.NumArr) And Pos2 <= UBound(Me.NumArr)) End Function ' 交換 2 指定陣列位址內之值 Private Sub Swap(Pos1 As Integer, Pos2 As Integer) Dim Temp As Integer If Me.CheckRange(Pos1, Pos2) Then Temp = Me.NumArr(Pos1) Me.NumArr(Pos1) = Me.NumArr(Pos2) Me.NumArr(Pos2) = Temp End If End Sub ' 求陣列所有值之總和 Public Function Sum() As Integer Dim Temp As Integer = 0 For i = 0 To UBound(Me.NumArr) Temp = Temp + Me.NumArr(i) Next Return Temp End Function ' 排序-使用迴圈 Public Function Sort() As Integer Dim TotalSwapCount As Integer = 0 If (UBound(Me.NumArr) <= 0) Then Return TotalSwapCount End If For i = 0 To UBound(Me.NumArr) - 1 Dim BigValue As Integer = Me.NumArr(0) Dim BigNumPos As Integer = 0 Dim MaxPos As Integer = 0 Dim CurrentSwapCount As Integer = 0 For j = 1 To UBound(Me.NumArr) - i If Me.NumArr(j) > BigValue Then BigValue = Me.NumArr(j) MaxPos = j Else If Me.NumArr(j) < BigValue Then Me.Swap(j, MaxPos) MaxPos = j CurrentSwapCount = CurrentSwapCount + 1 Else End If End If Next If CurrentSwapCount > 0 Then Console.WriteLine("{0}> 交換次數={1}", i + 1, CurrentSwapCount) TotalSwapCount = TotalSwapCount + CurrentSwapCount End If Next Return TotalSwapCount End Function ' 排序-使用遞迴 Public Function Sort(LastPos As Integer) As Integer Dim TotalSwapCount As Integer = 0 If (UBound(Me.NumArr) <= 0) Or (LastPos <= 0) Then Return TotalSwapCount End If Dim BigValue As Integer = Me.NumArr(0) Dim MaxPos As Integer = 0 Dim BigNumPos As Integer = 0 For i = 1 To LastPos If Me.NumArr(i) > BigValue Then BigValue = Me.NumArr(i) MaxPos = i Else If Me.NumArr(i) < BigValue Then Me.Swap(i, MaxPos) MaxPos = i TotalSwapCount = TotalSwapCount + 1 Else End If End If Next If TotalSwapCount > 0 Then Console.WriteLine("{0}> 交換次數={1}", UBound(Me.NumArr) - LastPos + 1, TotalSwapCount) ' 遞迴呼叫 Dim CurrentCount = Me.Sort(LastPos - 1) If CurrentCount > 0 Then TotalSwapCount = TotalSwapCount + CurrentCount End If End If Return TotalSwapCount End Function End Class ' 宣告自訂類別物件 Dim MyNumOp As NumOp = Nothing ' 主程序 Sub Main() ' 指定陣列內容 Dim TempArray() As Integer = {8, 11, 2, 9, 33, 1, 11, 7, 19} MyNumOp = New NumOp(UBound(TempArray) + 1) MyNumOp.Assign(TempArray) ' 排序 MyNumOp.Print("排序前:") ' Console.WriteLine("總 交換次數={0}", MyNumOp.Sort(UBound(TempArray))) Console.WriteLine("{0}總 交換次數={1}{2}", vbCrLf, MyNumOp.Sort(), vbCrLf) MyNumOp.Print("排序後:") ' 排序一個已排序好之陣列 TempArray = Nothing TempArray = {1, 2, 7, 8, 9, 11, 11, 19, 33} MyNumOp.Assign(TempArray) Console.WriteLine("{0}總 交換次數={1}{2}", vbCrLf, MyNumOp.Sort(), vbCrLf) ' 排序一個已反序排好之陣列 TempArray = Nothing TempArray = {33, 19, 11, 11, 9, 8, 7, 2, 1} MyNumOp.Assign(TempArray) Console.WriteLine("{0}總 交換次數={1}{2}", vbCrLf, MyNumOp.Sort(), vbCrLf) ' Console.WriteLine("和={0}", MyNumOp.Sum()) Console.ReadKey() End Sub End Module