常用排序算法之计数排序,基数排序与桶排序

本文介绍了基数排序和桶排序的实现方法,并提供了详细的VBScript代码示例。通过随机生成的数据集展示了这两种非比较型整数排序算法的具体操作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

'计数排序,基数排序
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
= 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(400100), 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 
= 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)
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值