Strand sort - Wikipedia, the free encyclopedia
http://en.wikipedia.org/wiki/Strand_sortWikipediaにストランドソートの日本語のページがなかった。いやん。英語のページの表とかコードとかをみてストランドソートを実装してみた。ストランドソートのアルゴリズムは、入力配列から要素を抜き出すことによってソート済みのサブ配列を作成して、結果配列にマージしていく感じのものだろう、たぶん。
サブ配列の長さがいくつになるかわからないので動的配列クラスを作成した。
Class ArrayList
Private Data()
Private Length
Public Function GetLength()
GetLength = Length
End Function
Private Sub Class_Initialize()
ReDim Preserve Data(3)
Length = 0
End Sub
Public Function GetElement(ByVal index)
GetElement = Data(index)
End Function
Public Sub Add(ByVal element)
If (UBound(Data) < Length) Then
ReDim Preserve Data(Length + Length - 1)
End If
Data(Length) = element
Length = Length + 1
End Sub
Public Sub Clear()
ReDim Data(3)
Length = 0
End Sub
Public Function ToString()
Dim a
a = Data
ReDim Preserve a(Length - 1)
ToString = Join(a, ",")
End Function
End Class
Sub Strandsort(ByRef src)
Dim subList
Set subList = New ArrayList
Dim result()
ReDim Preserve result(UBound(src))
Dim resultLow
resultLow = UBound(result) + 1
Dim newLow
Do While (0 <= UBound(src))
Call subList.Add(src(0))
Dim i, j, e
j = 0
e = src(0)
For i = 1 To UBound(src)
If (e <= src(i)) Then
subList.Add(src(i))
e = src(i)
Else
src(j) = src(i)
j = j + 1
End If
Next
ReDim Preserve src(j - 1)
newLow = resultLow - subList.GetLength()
Call StrandsortMerge(subList, result, resultLow, newLow)
resultLow = newLow
Call subList.Clear()
Loop
ReDim Preserve src(UBound(result))
For i = 0 To UBound(src)
src(i) = result(i)
Next
End Sub
Sub StrandsortMerge(ByVal subList, ByRef result, ByVal resultLow, ByVal newLow)
Dim s, r, n, sUpp, rUpp
s = 0
sUpp = subList.GetLength() - 1
r = resultLow
rUpp = UBound(result)
n = newLow
Do
If (s > sUpp) Then
Exit Sub
ElseIf (r > rUpp) Then
Do
result(n) = subList.GetElement(s)
n = n + 1
s = s + 1
Loop While (s <= sUpp)
Exit Sub
Else
If (subList.GetElement(s) < result(r)) Then
result(n) = subList.GetElement(s)
n = n + 1
s = s + 1
Else
result(n) = result(r)
n = n + 1
r = r + 1
End If
End If
Loop
End Sub
ストランドソートの処理速度はバブルソートより速く、マージソートより遅かった。Wikipediaの英語のページをみると、ストランドソートはLinkedListをソートするときに使われるのさみたいなことが書かれているような気がする。LinkedListを使う実装を試みたのだけれども、意外と難しかった。もうすこし考えてみよう。できたら後日記事にしましょう。はいそうしましょうということで、また後日。
posted by moritora at 23:54|
Comment(0)
|
VBScript
|

|