1 Sub Main()
2 Application.ScreenUpdating = False
3 On Error GoTo Line
4 Dim Ar(), NO As Integer
5 Ar = Application.WorksheetFunction.Transpose((Range("a1").CurrentRegion.Value))
6 NO = VBA.InputBox("输入算法方式: 1、BubbleSort,2、CountingSort,3、QuickSort,4、WorksheetSort", "方式选择", "1") '
7 Dim T
8 T = Timer
9 Select Case NO
10 Case Is = 1
11 BubbleSort Ar
12 Case Is = 2
13 CountingSort Ar
14 Case Is = 3
15 QuickSort Ar, LBound(Ar), UBound(Ar)
16 Case Is = 4
17 WorkShtSort Ar
18 Case Else
19 MsgBox "错误输入", vbInformation + vbOKOnly
20 Exit Sub
21 End Select
22
23 Range("c1").Resize(UBound(Ar), 1) = Application.WorksheetFunction.Transpose(Ar)
24 Application.ScreenUpdating = True
25 MsgBox Format(Timer - T, "0.00Sec"), vbInformation + vbOKOnly
26 Exit Sub
27 Line: MsgBox Err.Description
28 End Sub
29
30 '====================================================冒泡排序===================================================
31 Sub BubbleSort(ByRef list) 'ByRef 引用传递
32 Dim L As Long, H As Long '上下标
33 Dim i As Long, J As Long
34 Dim Temp '过渡
35 L = LBound(list): H = UBound(list)
36 For i = 1 To (H - 1) '有序区间极值
37 For J = (i + 1) To H '无序区间每个值
38 If list(i) > list(J) Then
39 Temp = list(i) ' 取出较大值指向H 即升序
40 list(i) = list(J)
41 list(J) = Temp
42 End If
43 Next J
44 Next i
45 End Sub
46
47 '==================================================计数排序=====================================================
48 Sub CountingSort(ByRef list) '只适合long类型的数组
49 Dim Lo As Long, Hi As Long, Count() '2个极值和Count存储数组
50 Dim L As Long, H As Long '上下标
51 Dim i As Long, J As Long
52 Lo = Application.WorksheetFunction.min(list)
53 Hi = Application.WorksheetFunction.max(list)
54 ReDim Count(Lo To Hi)
55 L = LBound(list): H = UBound(list)
56 '遍历list 填充Count数组
57 For i = L To H
58 Count(list(i)) = Count(list(i)) + 1 '索引++
59 Next i
60
61 Dim K As Long '初始下标
62 K = L
63 '遍历Count数组 排序list
64 For i = Lo To Hi '升序
65 For J = 1 To Count(i)
66 list(K) = i
67 K = K + 1
68 Next J
69 Next i
70 End Sub
71
72 '==================================================快速排序=====================================================
73 Sub QuickSort(ByRef list, L, H) 'LH 左右指针,二分区间
74 If L >= H Then Exit Sub
75 Dim RValue As Long, Rd As Long
76 Randomize '初始化
77 Rd = Int((H - L + 1) * Rnd + L)
78 RValue = list(Rd) '基准值
79 list(Rd) = list(L)
80
81 Dim Lo As Long, Hi As Long '二分法上下限
82 Lo = L: Hi = H
83 Do '大循环'挖坑法
84 Do While list(Hi) >= RValue ' Hi>>>>Lo
85 Hi = Hi - 1
86 If Hi = Lo Then Exit Do '指针相遇即退出
87 Loop
88 If Hi = Lo Then
89 list(Lo) = RValue '不满足排序的递归前需要list元素还原
90 Exit Do '退出大循环
91 Else
92 list(Lo) = list(Hi)
93 End If
94 '-----------------------------------------
95 Do While list(Lo) < RValue 'Lo>>>>Hi
96 Lo = Lo + 1
97 If Hi = Lo Then Exit Do '指针相遇即退出
98 Loop
99 If Lo = Hi Then
100 list(Hi) = RValue '不满足排序的递归前需要list元素还原
101 Exit Do '退出大循环
102 Else
103 list(Hi) = list(Lo)
104 End If
105 Loop
106 '------递归------
107 QuickSort list, L, Lo - 1
108 QuickSort list, Lo + 1, H
109 End Sub
110
111 '================================================工作表排序=====================================================
112 Sub WorkShtSort(ByRef list)
113 Application.DisplayAlerts = False
114 Dim Sht As Worksheet
115 Set Sht = Worksheets.Add(after:=Sheets(Sheets.Count))
116 Range("a1").Resize(UBound(list), 1) = Application.WorksheetFunction.Transpose(list)
117 Range("a1").Resize(UBound(list), 1).Sort key1:=Range("a1")
118 list = Application.WorksheetFunction.Transpose((Range("a1").CurrentRegion.Value))
119 Sht.Delete
120 Application.DisplayAlerts = True
121 End Sub