七种排序方法

Option   Explicit
Global 
Const  ZERO  =   0
Global 
Const  ASCENDING_ORDER  =   0
Global 
Const  DESCENDING_ORDER  =   1

Global gIterations

Sub BubbleSort(MyArray(), ByVal nOrder As Integer)
Dim Index
Dim TEMP
Dim NextElement

    NextElement 
= ZERO
    
Do While (NextElement < UBound(MyArray))
        Index 
= UBound(MyArray)
        
Do While (Index > NextElement)
            
If nOrder = ASCENDING_ORDER Then
                
If MyArray(Index) < MyArray(Index - 1Then
                    TEMP 
= MyArray(Index)
                    MyArray(Index) 
= MyArray(Index - 1)
                    MyArray(Index 
- 1= TEMP
                
End If
            
ElseIf nOrder = DESCENDING_ORDER Then
                
If MyArray(Index) >= MyArray(Index - 1Then
                    TEMP 
= MyArray(Index)
                    MyArray(Index) 
= MyArray(Index - 1)
                    MyArray(Index 
- 1= TEMP
                
End If
            
End If
            Index 
= Index - 1
            gIterations 
= gIterations + 1
        
Loop
        NextElement 
= NextElement + 1
        gIterations 
= gIterations + 1
    
Loop

End Sub


Sub Bucket(MyArray(), ByVal nOrder As Integer)
Dim Index
Dim NextElement
Dim TheBucket

    NextElement 
= LBound(MyArray) + 1
    
While (NextElement <= UBound(MyArray))
        TheBucket 
= MyArray(NextElement)
        Index 
= NextElement
        
Do
            
If Index > LBound(MyArray) Then
                
If nOrder = ASCENDING_ORDER Then
                    
If TheBucket < MyArray(Index - 1Then
                        MyArray(Index) 
= MyArray(Index - 1)
                        Index 
= Index - 1
                    
Else
                        
Exit Do
                    
End If
                
ElseIf nOrder = DESCENDING_ORDER Then
                    
If TheBucket >= MyArray(Index - 1Then
                        MyArray(Index) 
= MyArray(Index - 1)
                        Index 
= Index - 1
                    
Else
                        
Exit Do
                    
End If
                
End If
            
Else
                
Exit Do
            
End If
            gIterations 
= gIterations + 1
        
Loop
        MyArray(Index) 
= TheBucket
        NextElement 
= NextElement + 1
        gIterations 
= gIterations + 1
    Wend

End Sub


Sub Heap(MyArray())
Dim Index
Dim Size
Dim TEMP

    Size 
= UBound(MyArray)
    
    Index 
= 1
    
While (Index <= Size)
        
Call HeapSiftup(MyArray(), Index)
        Index 
= Index + 1
        gIterations 
= gIterations + 1
    Wend

    Index 
= Size
    
While (Index > 0)
        TEMP 
= MyArray(0)
        MyArray(
0= MyArray(Index)
        MyArray(Index) 
= TEMP
        
Call HeapSiftdown(MyArray(), Index - 1)
        Index 
= Index - 1
        gIterations 
= gIterations + 1
    Wend

End Sub

 

Sub HeapSiftdown(MyArray(), M)
Dim Index
Dim Parent
Dim TEMP

    Index 
= 0
    Parent 
= 2 * Index

    
Do While (Parent <= M)
        
        
If (Parent < M And MyArray(Parent) < MyArray(Parent + 1)) Then
            Parent 
= Parent + 1
        
End If

        
If MyArray(Index) >= MyArray(Parent) Then
            
Exit Do
        
End If

        TEMP 
= MyArray(Index)
        MyArray(Index) 
= MyArray(Parent)
        MyArray(Parent) 
= TEMP
        
        Index 
= Parent
        Parent 
= 2 * Index

        gIterations 
= gIterations + 1
    
Loop
End Sub


Sub HeapSiftup(MyArray(), M)
Dim Index
Dim Parent
Dim TEMP

    Index 
= M
    
Do While (Index > 0)
        Parent 
= Int(Index / 2)

        
If MyArray(Parent) >= MyArray(Index) Then
            
Exit Do
        
End If
        
        TEMP 
= MyArray(Index)
        MyArray(Index) 
= MyArray(Parent)
        MyArray(Parent) 
= TEMP

        Index 
= Parent
        gIterations 
= gIterations + 1
    
Loop
    
End Sub


Sub Insertion(MyArray(), ByVal nOrder As Integer)
Dim Index
Dim TEMP
Dim NextElement
    
    NextElement 
= LBound(MyArray) + 1
    
While (NextElement <= UBound(MyArray))
        Index 
= NextElement
        
Do
            
If Index > LBound(MyArray) Then
                
If nOrder = ASCENDING_ORDER Then
                    
If MyArray(Index) < MyArray(Index - 1Then
                        TEMP 
= MyArray(Index)
                        MyArray(Index) 
= MyArray(Index - 1)
                        MyArray(Index 
- 1= TEMP
                        Index 
= Index - 1
                    
Else
                        
Exit Do
                    
End If
                
ElseIf nOrder = DESCENDING_ORDER Then
                    
If MyArray(Index) >= MyArray(Index - 1Then
                        TEMP 
= MyArray(Index)
                        MyArray(Index) 
= MyArray(Index - 1)
                        MyArray(Index 
- 1= TEMP
                        Index 
= Index - 1
                    
Else
                        
Exit Do
                    
End If
                
End If
            
Else
                
Exit Do
            
End If
            gIterations 
= gIterations + 1
        
Loop
        NextElement 
= NextElement + 1
        gIterations 
= gIterations + 1
    Wend

End Sub


Sub QuickSort(MyArray(), L, R)
Dim I, J, X, Y

    I 
= L
    J 
= R
    X 
= MyArray((L + R) / 2)
        
    
While (I <= J)
        
While (MyArray(I) < X And I < R)
            I 
= I + 1
        Wend
        
While (X < MyArray(J) And J > L)
            J 
= J - 1
        Wend
        
If (I <= J) Then
            Y 
= MyArray(I)
            MyArray(I) 
= MyArray(J)
            MyArray(J) 
= Y
            I 
= I + 1
            J 
= J - 1
        
End If
        gIterations 
= gIterations + 1
    Wend

    
If (L < J) Then Call QuickSort(MyArray(), L, J)
    
If (I < R) Then Call QuickSort(MyArray(), I, R)

End Sub


Sub Selection(MyArray(), ByVal nOrder As Integer)
Dim Index
Dim Min
Dim NextElement
Dim TEMP

    NextElement 
= 0
    
While (NextElement < UBound(MyArray))
        Min 
= UBound(MyArray)
        Index 
= Min - 1
        
While (Index >= NextElement)
            
If nOrder = ASCENDING_ORDER Then
                
If MyArray(Index) < MyArray(Min) Then
                    Min 
= Index
                
End If
            
ElseIf nOrder = DESCENDING_ORDER Then
                
If MyArray(Index) >= MyArray(Min) Then
                    Min 
= Index
                
End If
            
End If
            Index 
= Index - 1
            gIterations 
= gIterations + 1
        Wend
        TEMP 
= MyArray(Min)
        MyArray(Min) 
= MyArray(NextElement)
        MyArray(NextElement) 
= TEMP
        NextElement 
= NextElement + 1
        gIterations 
= gIterations - 1
    Wend

End Sub


Sub ShellSort(MyArray(), ByVal nOrder As Integer)
Dim Distance
Dim Size
Dim Index
Dim NextElement
Dim TEMP

    Size 
= UBound(MyArray) - LBound(MyArray) + 1
    Distance 
= 1

    
While (Distance <= Size)
        Distance 
= 2 * Distance
    Wend

    Distance 
= (Distance / 2- 1
    
    
While (Distance > 0)
    
        NextElement 
= LBound(MyArray) + Distance
    
        
While (NextElement <= UBound(MyArray))
            Index 
= NextElement
            
Do
                
If Index >= (LBound(MyArray) + Distance) Then
                    
If nOrder = ASCENDING_ORDER Then
                        
If MyArray(Index) < MyArray(Index - Distance) Then
                            TEMP 
= MyArray(Index)
                            MyArray(Index) 
= MyArray(Index - Distance)
                            MyArray(Index 
- Distance) = TEMP
                            Index 
= Index - Distance
                            gIterations 
= gIterations + 1
                        
Else
                            
Exit Do
                        
End If
                    
ElseIf nOrder = DESCENDING_ORDER Then
                        
If MyArray(Index) >= MyArray(Index - Distance) Then
                            TEMP 
= MyArray(Index)
                            MyArray(Index) 
= MyArray(Index - Distance)
                            MyArray(Index 
- Distance) = TEMP
                            Index 
= Index - Distance
                            gIterations 
= gIterations + 1
                        
Else
                            
Exit Do
                        
End If
                    
End If
                
Else
                    
Exit Do
                
End If
            
Loop
            NextElement 
= NextElement + 1
            gIterations 
= gIterations + 1
        Wend
        Distance 
= (Distance - 1/ 2
        gIterations 
= gIterations + 1
    Wend
    
End Sub
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值