'
计数排序,基数排序
Option Explicit
Dim Result, I
Dim TestData( 100 )
const N = 100
Randomize
For I = 0 To N - 1
TestData(I) = ROUND ( RND () * 32768 )
Next
' 以base^pow位上的数映射到Map
Sub MapTo(byRef Array , byRef Map, low, hi, base, pow)
Dim i, n
n = 1
For i = 1 To pow
n = n * base
Next
For i = low To hi
Map(i) = Int ( Array (i) / n) Mod base
Next
End Sub
' 以映射进行计数排序
Sub CSortWithMap(byRef Array , byRef Map, low, hi)
Dim Counter( 16 ), Temp( 100 ), i
For i = 0 To uBound (Counter)
Counter(i) = 0
Next
For i = low To hi
Counter(Map(i)) = Counter(Map(i)) + 1
Next
For i = 1 To uBound (Counter)
Counter(i) = Counter(i) + Counter(i - 1 )
Next
For i = hi To low Step - 1
Counter(Map(i)) = Counter(Map(i)) - 1
Temp(Counter(Map(i))) = Array (i)
Next
For i = low To hi
Array (i) = Temp(i)
Next
End Sub
' 基数排序
Sub BSort(byRef Array , low, hi)
Dim Map( 100 ), i
For i = 0 To 4
MapTo Array , Map, low, hi, 16 , i
CSortWithMap Array , Map, low, hi
Next
End Sub
BSort TestData, 0 , N - 1
For I = 0 To N - 1
Result = Result & TestData(I) & VbTab
Next
MsgBox (Result)
Option Explicit
Dim Result, I
Dim TestData( 100 )
const N = 100
Randomize
For I = 0 To N - 1
TestData(I) = ROUND ( RND () * 32768 )
Next
' 以base^pow位上的数映射到Map
Sub MapTo(byRef Array , byRef Map, low, hi, base, pow)
Dim i, n
n = 1
For i = 1 To pow
n = n * base
Next
For i = low To hi
Map(i) = Int ( Array (i) / n) Mod base
Next
End Sub
' 以映射进行计数排序
Sub CSortWithMap(byRef Array , byRef Map, low, hi)
Dim Counter( 16 ), Temp( 100 ), i
For i = 0 To uBound (Counter)
Counter(i) = 0
Next
For i = low To hi
Counter(Map(i)) = Counter(Map(i)) + 1
Next
For i = 1 To uBound (Counter)
Counter(i) = Counter(i) + Counter(i - 1 )
Next
For i = hi To low Step - 1
Counter(Map(i)) = Counter(Map(i)) - 1
Temp(Counter(Map(i))) = Array (i)
Next
For i = low To hi
Array (i) = Temp(i)
Next
End Sub
' 基数排序
Sub BSort(byRef Array , low, hi)
Dim Map( 100 ), i
For i = 0 To 4
MapTo Array , Map, low, hi, 16 , i
CSortWithMap Array , Map, low, hi
Next
End Sub
BSort TestData, 0 , N - 1
For I = 0 To N - 1
Result = Result & TestData(I) & VbTab
Next
MsgBox (Result)
'
桶排序
Option Explicit
Dim Result, I
Dim TestData( 100 )
const N = 100
Randomize
For I = 0 To N - 1
TestData(I) = ROUND ( RND () * 32768 )
Next
' 桶排序
Sub BSort(byRef Array , low, hi)
Dim Bucket( 400 , 100 ), Counter( 400 ), i, j, t, idx
For i = 0 To 399
Counter(i) = 0
Next
For i = low To hi
idx = Int ( Array (i) / 100 )
j = Counter(idx) - 1
t = Array (i)
Do
If j < 0 Then
Exit Do
End If
If Array (j) > t Then
Bucket(idx, j + 1 ) = Bucket(idx, j)
j = j - 1
Else
Exit Do
End If
Loop
Bucket(idx, j + 1 ) = t
Counter(idx) = Counter(idx) + 1
Next
t = low
For i = 0 To 399
For j = 1 To Counter(i)
Array (t) = Bucket(i, j - 1 )
t = t + 1
Next
Next
End Sub
BSort TestData, 0 , N - 1
For I = 0 To N - 1
Result = Result & TestData(I) & VbTab
Next
MsgBox (Result)
Option Explicit
Dim Result, I
Dim TestData( 100 )
const N = 100
Randomize
For I = 0 To N - 1
TestData(I) = ROUND ( RND () * 32768 )
Next
' 桶排序
Sub BSort(byRef Array , low, hi)
Dim Bucket( 400 , 100 ), Counter( 400 ), i, j, t, idx
For i = 0 To 399
Counter(i) = 0
Next
For i = low To hi
idx = Int ( Array (i) / 100 )
j = Counter(idx) - 1
t = Array (i)
Do
If j < 0 Then
Exit Do
End If
If Array (j) > t Then
Bucket(idx, j + 1 ) = Bucket(idx, j)
j = j - 1
Else
Exit Do
End If
Loop
Bucket(idx, j + 1 ) = t
Counter(idx) = Counter(idx) + 1
Next
t = low
For i = 0 To 399
For j = 1 To Counter(i)
Array (t) = Bucket(i, j - 1 )
t = t + 1
Next
Next
End Sub
BSort TestData, 0 , N - 1
For I = 0 To N - 1
Result = Result & TestData(I) & VbTab
Next
MsgBox (Result)