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

' 计数排序,基数排序
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( 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  
=  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)
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值