記事の個別表示(修正可)
タイトル  お気に入りルーチン(ソート)
本文  
 私がプログラミングで気に入り、多用するルーチンが有る。それはクイックソートだ。何が気に入ったかと言えば、早い。とにかく早い事が気に入った。ソートにはいろいろあり、データの大きさでアルゴリズムを変えるのが賢いやり方だろう。だが、サンデープログラマーは、そんな面倒はしない。バカの一つ覚えで、何でもかんでもソートは、このクイックソートで済ます。もっとも、それでもデータの型に従って、アレンジ位はするけどね。

 まず、データだ。それもデカイデータだ。それをdt_big()としよう。それに付随するデータをdt_data1()から、dt_datan()とする。これを、dt_big()に従ってソートする。

 まず、ポインターの準備をする。dt_no1()とでもしようか。そこには、順番を示す番号を格納する。それと結果を格納するdt_work()を準備しよう。まず、データの準備だ。プログラムでは、こうなる

for i=1 to dt_total
  dt_work(i)=dt_big(i)
  dt_no1(i)=i
next
call sub_sort(dt_work,dt_no1,1,dt_total)

 で、肝心のソートは、以下を使う

Public Sub sub_sort(ByRef st_data() As String, ByRef st_no() As Integer, l As Integer, r As Integer)
  Dim s As String, t As String
  Dim i As Integer, j As Integer, k As Integer
  If l < r Then
    s = st_data((l + r) \ 2)   
    i = l - 1 : j = r + 1 
    Do While 1 
      Do
        i = i + 1
      Loop While st_data(i) < s
      Do
        j = j - 1
      Loop While st_data(j) > s
      If i >= j Then Exit Do
      t = st_data(i) : st_data(i) = st_data(j) : st_data(j) = t
      k = st_no(i) : st_no(i) = st_no(j) : st_no(j) = k
    Loop

    sub_sort(st_data, st_no, l, i - 1)         '左部分列に対する再帰呼び出し
    sub_sort(st_data, st_no, j + 1, r)         '右部分列に対する再帰呼び出し
  End If
End Sub

 それぞれのデータは、dt_data1(dt_no(i)) でソートされたデータを得る事が出来る。元のデータを乱す事も無い。従って、次は別のデータでソートするのも問題は無い。
...51525354555657585960...