tagCANDY CGI VBレスキュー(花ちゃん) - ソート色々(VB6.0) - Visual Basic 6.0 VB2005 VB2010
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ
ソート色々(VB6.0)
元に戻る スレッド一覧へ 記事閲覧
このページ内の検索ができます。(AND 検索や OR 検索のような複数のキーワードによる検索はできません。)

ソート色々(VB6.0) [No.5の個別表示]
     サンプル投稿用掲示板  VB2005 〜 用トップページ  VB6.0 用 トップページ
日時: 2009/12/27 15:37
名前: 花ちゃん

***********************************************************************************
* カテゴリー:[文字列処理][アルゴリズム][]                                      *
* キーワード:アルゴリズム,並べ替える,小さい順(昇順),大きい順(降順),並び替え *
***********************************************************************************

【開設当初の掲示板に投稿頂いていた分です】

--------------------------------------------------------------------------
ソート:バブルソート  投稿者:ゆう(U) [1998/09/14(月)15:24分]
--------------------------------------------------------------------------

前回のバブルソートですがちょっとしたバグが有りました。
(配列の添字が負の数を使用されていると正しい結果を返しません)

と言う訳で添字に負を指定されていても問題なく動作するものをUPします。

'バブルソート(Long版)
'Sorted(省略可能) = True :昇順(デフォルト)
'               False:降順
Public Sub sBubleSort(ByRef myArray() As Long, _
                      Optional Sorted As Boolean = True)
  Dim i As Long
  Dim j As Long
  Dim k As Long
  Dim intMyPointer As Integer
  Dim lngLow As Long, lngHigh As Long

  lngLow = LBound(myArray)
  lngHigh = UBound(myArray)
  intMyPointer = Screen.MousePointer
  Screen.MousePointer = vbHourglass

  Select Case Sorted
    Case True '昇順
      For i = lngHigh To lngLow Step -1
        For j = lngLow + 1 To i
          k = j - 1
          If myArray(k) > myArray(j) Then
            myArray(j) = myArray(j) Xor myArray(k)
            myArray(k) = myArray(j) Xor myArray(k)
            myArray(j) = myArray(j) Xor myArray(k)
          End If
        Next j
      Next i
    Case Else '降順
      For i = lngHigh To lngLow Step -1
        For j = lngLow + 1 To i
          k = j - 1
          If myArray(k) < myArray(j) Then
            myArray(j) = myArray(j) Xor myArray(k)
            myArray(k) = myArray(j) Xor myArray(k)
            myArray(j) = myArray(j) Xor myArray(k)
          End If
        Next j
      Next i
  End Select
  Screen.MousePointer = intMyPointer
End Sub

メンテ

Page: 1 |

ソート:シェルソート(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

メンテ

Page: 1 |

 投稿フォーム               スレッド一覧へ
題  名 スレッドをトップへソート
名  前
パスワード (記事メンテ時に使用)
投稿キー (投稿時 投稿キー を入力してください)
コメント

   クッキー保存   
スレッド一覧へ