私がプログラミングで気に入り、多用するルーチンが有る。それはクイックソートだ。何が気に入ったかと言えば、早い。とにかく早い事が気に入った。ソートにはいろいろあり、データの大きさでアルゴリズムを変えるのが賢いやり方だろう。だが、サンデープログラマーは、そんな面倒はしない。バカの一つ覚えで、何でもかんでもソートは、このクイックソートで済ます。もっとも、それでもデータの型に従って、アレンジ位はするけどね。
まず、データだ。それもデカイデータだ。それを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)) でソートされたデータを得る事が出来る。元のデータを乱す事も無い。従って、次は別のデータでソートするのも問題は無い。