3流(技術屋 and 本読み) このページをアンテナに追加 Twitter

本サイトでは2008-6-16よりGoogleAnalyticsによる解析を行っています。

2006-09-25 vb用コムソートのソース

[] 01:30 を含むブックマーク のブックマークコメント

クイックソートは平均的に最速のソート方法だが、運が悪いとすさまじく時間がかかったりする。まあ、その運の悪さが発生しないように工夫して実装されているようだが。その実装は、初見の人間を確実に混乱させる。

そこでコムソートだ。コムソートはクイックソートの2倍程度時間がかかるようだが、運に左右されず、ほぼ安定した速度を提供するようだ(クイックソート同様安定ソートではない)。なによりコードが難解でない。

ネット上でVBA用のコードを探したのだが、JavaScript用やC言語用しか見つからなかったので移植してみた。

検索用 VB VBA コムソート コームソート 櫛ソート comb sort

Private Function CombSort(ByVal ArrayData As Variant) As Variant

    Dim LowerBoundNumber As Long
    Dim UpperBoundNumber As Long
    Dim i                As Long
    Dim j                As Long
    Dim Temp             As Variant
    Dim gap              As Long
    Dim EndFlag          As Boolean
    Dim CombGap          As Single
    
    CombGap = 1.3 'constできるならしたほうがいいかも
    
    LowerBoundNumber = LBound(ArrayData)
    UpperBoundNumber = UBound(ArrayData)
    
    gap = UpperBoundNumber - LowerBoundNumber
    
    EndFlag = False
    
    Do While gap > 1 Or EndFlag = False
        gap = Int(gap / CombGap)
        
        If gap = 9 Or gap = 10 Then gap = 11  
        '↑この行はデータが少ない場合コメントアウトしてもいい
        If gap < 1 Then gap = 1
        
        EndFlag = True
        For i = LowerBoundNumber To UpperBoundNumber - gap
            j = i + gap
            If ArrayData(i) > ArrayData(j) Then
                Temp = ArrayData(i)
                ArrayData(i) = ArrayData(j)
                ArrayData(j) = Temp
                EndFlag = False
            End If
        Next
    Loop
    
    CombSort = ArrayData
    
End Function
トラックバック - http://d.hatena.ne.jp/marujx/20060925