ソート:シェルソート(VB6.0) (No.1の個別表示) [スレッド一覧へ] |
- 日時: 2011/04/05 11:36
- 名前: 花ちゃん
- ***********************************************************************************
* カテゴリー:[文字列処理][アルゴリズム][] * * キーワード:アルゴリズム,並べ替える,小さい順(昇順),大きい順(降順),並び替え * ***********************************************************************************
【開設当初の掲示板に投稿頂いていた分です】
----------------------------------------------------------------------- ソート:シェルソート 投稿者:ゆう(U) [1998/9/14(月)15:24分] -----------------------------------------------------------------------
'シェルソート(Long版) 'Sorted(省略可能) = True :昇順(デフォルト) ' False:降順 Public Sub sShellSort(ByRef myArray() As Long, _ Optional Sorted As Boolean = True) Dim i As Long, j As Long, k As Long Dim intMyPointer As Integer Dim lngGap As Long Dim lngLow As Long, lngHigh As Long, lngCount As Long Dim tmpArray As Long
intMyPointer = Screen.MousePointer Screen.MousePointer = vbHourglass lngLow = LBound(myArray) lngHigh = UBound(myArray) lngCount = lngHigh - lngLow + 1 lngGap = 1
k = Int(lngCount / 3) Do While (lngGap < k) lngGap = lngGap * 3 + 1 Loop
If Sorted Then Do While (lngGap > 0) For i = lngGap + lngLow To lngHigh j = i tmpArray = myArray(j) Do While j >= lngGap + lngLow If myArray(j - lngGap) <= tmpArray Then Exit Do myArray(j) = myArray(j - lngGap) j = j - lngGap Loop myArray(j) = tmpArray Next i lngGap = Int(lngGap / 3) Loop Else Do While (lngGap > 0) For i = lngGap + lngLow To lngHigh j = i tmpArray = myArray(j) Do While j >= lngGap + lngLow If myArray(j - lngGap) >= tmpArray Then Exit Do myArray(j) = myArray(j - lngGap) j = j - lngGap Loop myArray(j) = tmpArray Next i lngGap = Int(lngGap / 3) Loop End If Screen.MousePointer = intMyPointer End Sub
|
ソート:ヒープソート(VB6.0) (No.2の個別表示) [スレッド一覧へ] |
- 日時: 2011/04/05 11:36
- 名前: 花ちゃん
- ***********************************************************************************
* カテゴリー:[文字列処理][アルゴリズム][] * * キーワード:アルゴリズム,並べ替える,小さい順(昇順),大きい順(降順),並び替え * ***********************************************************************************
【開設当初の掲示板に投稿頂いていた分です】
---------------------------------------------------------------------- ソート:ヒープソート 投稿者:ゆう(U) [1998/09/14(月)15:25分] ----------------------------------------------------------------------
' ヒープソート(Long版) 'Sorted(省略可能) = True :昇順(デフォルト) ' False:降順 Public Sub sHeapSort(ByRef myArray() As Long, _ Optional Sorted As Boolean = True) Dim i As Long, j As Long, k As Long, l As Long, m As Long Dim intMyPointer As Integer Dim lngLow As Long, lngHigh As Long, lngCount As Long Dim tmpArray As Long
intMyPointer = Screen.MousePointer Screen.MousePointer = vbHourglass lngLow = LBound(myArray) lngHigh = UBound(myArray) lngCount = lngHigh - lngLow
If Sorted Then For i = (lngCount \ 2) To i > 0 Step (-1) '共通化可能1 l = i: m = lngCount k = 2 * l Do While (k <= m) If k < m Then If myArray(k + 1 + lngLow) > myArray(k + lngLow) Then k = k + 1 End If End If If myArray(l + lngLow) >= myArray(k + lngLow) Then Exit Do tmpArray = myArray(l + lngLow) myArray(l + lngLow) = myArray(k + lngLow) myArray(k + lngLow) = tmpArray l = k k = 2 * l Loop 'ここまで Next i j = lngCount Do While j > 0 tmpArray = myArray(0 + lngLow) myArray(0 + lngLow) = myArray(j + lngLow) myArray(j + lngLow) = tmpArray j = j - 1 '共通化可能1 l = 0: m = j k = 2 * l Do While (k <= m) If k < m Then If myArray(k + 1 + lngLow) > myArray(k + lngLow) Then k = k + 1 End If End If If myArray(l + lngLow) >= myArray(k + lngLow) Then Exit Do tmpArray = myArray(l + lngLow) myArray(l + lngLow) = myArray(k + lngLow) myArray(k + lngLow) = tmpArray l = k k = 2 * l Loop 'ここまで Loop Else For i = (lngCount \ 2) To i > 0 Step (-1) '共通化可能2 l = i: m = lngCount k = 2 * l Do While (k <= m) If k < m Then If myArray(k + 1 + lngLow) < myArray(k + lngLow) Then k = k + 1 End If End If If myArray(l + lngLow) <= myArray(k + lngLow) Then Exit Do tmpArray = myArray(l + lngLow) myArray(l + lngLow) = myArray(k + lngLow) myArray(k + lngLow) = tmpArray l = k k = 2 * l Loop 'ここまで Next i j = lngCount Do While j > 0 tmpArray = myArray(0 + lngLow) myArray(0 + lngLow) = myArray(j + lngLow) myArray(j + lngLow) = tmpArray j = j - 1 '共通化可能2 l = 0: m = j k = 2 * l Do While (k <= m) If k < m Then If myArray(k + 1 + lngLow) < myArray(k + lngLow) Then k = k + 1 End If End If If myArray(l + lngLow) <= myArray(k + lngLow) Then Exit Do tmpArray = myArray(l + lngLow) myArray(l + lngLow) = myArray(k + lngLow) myArray(k + lngLow) = tmpArray l = k k = 2 * l Loop 'ここまで Loop End If
Screen.MousePointer = intMyPointer End Sub
|
ソート法の使用方法他(ゆうさん投稿分の)(VB6.0) (No.3の個別表示) [スレッド一覧へ] |
- 日時: 2011/04/08 12:10
- 名前: 花ちゃん
- ***********************************************************************************
* カテゴリー:[文字列処理][アルゴリズム][] * * キーワード:アルゴリズム,並べ替える,小さい順(昇順),大きい順(降順),並び替え * ***********************************************************************************
------------------------------------------------------------------ ソート(前述3つ) 投稿者:ゆう(U) [1998/09/14(月)15:26分] ------------------------------------------------------------------
使用方法はすべて同じです。
Dim i As Long Dim lngArray() As Long ReDim lngArray(0 To 100) '(-1000 To -1)等のソートもOK
For i = LBound(lngArray) To UBound(lngArray) lngArray(i) = i Next i
s????Sort lngArray [, True|, False]
速度を比較すると 低速← sBubleSort > sHeapSort > sShellSort →高速 の順です。 ※しかしソートするデータによってはもっと良い(特化)したソート方法が 考えられます(一般的なデータではシェルソートが早いみたい)。
ヒープソートの添字に負を使用できるようにしている部分をなくすと 今より速度が上がると思いますが、良い考えが思い浮かばずこの様な コードになってしまいました(+ lngLowがいっぱいで見栄えが悪い)。
なお、ソートについてはVisualBasicマガジン7月号と河西朝雄著 C言語によるはじめてのアルゴリズム入門(技術評論社)を参考に しました。
※しかし、VBマガジン7月号に掲載されているコードではテストに 不十分な為、コードを手直ししないとあまり使えません。 或るソートでソート後別のソートを試しても配列はソート済みの為 ソート時間が公正では無くなる。
花ちゃん(さん)のヒープソートも試したのですが負の添字もOKなどの 仕様で移植しきれなかったので上記アルゴリズム入門を参考にして作成 しました。
Long型以外、ユーザー定義型の配列などは前回の投稿を参考にして 手直しして使用して下さい。
※この仕様(添字に負を許す)でこのコードより早いソート方法や コードの修正点などをご存知の方(気づかれた方)、その方法を 教えて下さい。
|
ソート:クイックソート(VB6.0) (No.4の個別表示) [スレッド一覧へ] |
- 日時: 2011/04/05 11:37
- 名前: 花ちゃん
- ***********************************************************************************
* カテゴリー:[文字列処理][アルゴリズム][] * * キーワード:アルゴリズム,並べ替える,小さい順(昇順),大きい順(降順),並び替え * ***********************************************************************************
【開設当初の掲示板に投稿頂いていた分です】
---------------------------------------------------------------------- ソート:クイックソート 投稿者:ゆう(U) [1998/09/19(土)21:12分] ----------------------------------------------------------------------
' クイックソート(Long版) 'Sorted(省略可能) = True :昇順(デフォルト) ' False:降順 Public Sub sQuickSort(ByRef myArray() As Long, _ Optional Sorted As Boolean = True) Dim i As Long, j As Long, k As Long, l As Long, m As Long Dim intMyPointer As Integer Dim lngLow As Long, lngHigh As Long Dim tmpArray As Long
intMyPointer = Screen.MousePointer Screen.MousePointer = vbHourglass lngLow = LBound(myArray) lngHigh = UBound(myArray)
If Sorted Then Call sAQuick(myArray(), lngLow, lngHigh) Else Call sDQuick(myArray(), lngLow, lngHigh) End If
Screen.MousePointer = intMyPointer End Sub
'昇順用Quickソート Private Sub sAQuick(ByRef myArray() As Long, _ ByVal lngLeft As Long, _ ByVal lngRight As Long) Dim tmpArray As Long Dim i As Long, j As Long
If lngLeft < lngRight Then tmpArray = myArray((lngLeft + lngRight) \ 2) i = lngLeft j = lngRight Do While (True) Do While (myArray(i) < tmpArray) i = i + 1 Loop Do While (myArray(j) > tmpArray) j = j - 1 Loop If i >= j Then Exit Do myArray(i) = myArray(i) Xor myArray(j) myArray(j) = myArray(i) Xor myArray(j) myArray(i) = myArray(i) Xor myArray(j) i = i + 1 j = j - 1 Loop Call sAQuick(myArray(), lngLeft, i - 1) Call sAQuick(myArray(), j + 1, lngRight) End If End Sub
'降順用Quickソート Private Sub sDQuick(ByRef myArray() As Long, _ ByVal lngLeft As Long, _ ByVal lngRight As Long) Dim tmpArray As Long Dim i As Long, j As Long
If lngLeft < lngRight Then tmpArray = myArray((lngLeft + lngRight) \ 2) i = lngLeft j = lngRight Do While (True) Do While (myArray(i) > tmpArray) i = i + 1 Loop Do While (myArray(j) < tmpArray) j = j - 1 Loop If i >= j Then Exit Do myArray(i) = myArray(i) Xor myArray(j) myArray(j) = myArray(i) Xor myArray(j) myArray(i) = myArray(i) Xor myArray(j) i = i + 1 j = j - 1 Loop Call sDQuick(myArray(), lngLeft, i - 1) Call sDQuick(myArray(), j + 1, lngRight) End If End Sub
|
|