Dim n As Integer Dim data(100000) As Integer Dim p(100000) As Integer Dim bn As Integer '順位ソート 最大値探索法 Private Sub SearchMax(Byval n As integer) Dim i As Integer Dim j As Integer Dim k As Integer Dim m As Integer Dim sw As New Stopwatch Dim millisec As Long Dim dummy As Integer Dim pos(n) As Integer 'データdata(n)の順位 Dim max As Integer Dim min As Integer Dim posmax As Integer Dim posmin As Integer Dim maxnum As Integer Dim minnum As Integer ' 高分解能なタイマが利用可能か Console.WriteLine(Stopwatch.IsHighResolution) ' 出力例:True Cursor = System.Windows.Forms.Cursors.WaitCursor 'ストップウォッチを開始する sw.Reset() sw.Start() '順位を付ける '仮の最大値最小値 i = 1 max = data(1) min = data(1) maxnum = n minnum = 1 posmax = 1 posmin = 1 Do '最大値最小値とその位置を見つける For i = 1 To n If pos(i) = 0 Then If max < data(i) Then max = data(i) posmax = i End If If min > data(i) Then min = data(i) posmin = i End If End If Next i '順位を記録する pos(posmax) = maxnum pos(posmin) = minnum '仮の最大値最小値を探す maxnum = maxnum - 1 minnum = minnum + 1 For i = 1 To n If pos(i) = 0 Then max = data(i) min = data(i) posmax = i posmin = i Exit For End If Next i If maxnum = minnum Then pos(posmax) = maxnum End If Loop Until maxnum <= minnum '順位にもとづきソート m = 1 Do k = pos(m) If pos(m) = m Then m = m + 1 Else 'データ交換 dummy = data(m) data(m) = data(k) data(k) = dummy dummy = pos(m) pos(m) = pos(k) pos(k) = dummy End If Loop Until m > n X: 'ストップウォッチを止める sw.Stop() '結果を表示する millisec = sw.ElapsedMilliseconds TextBox3.Text = Str(millisec) + " msec" '表示 ListBox2.Items.Clear() For i = 1 To n ListBox2.Items.Add(Str(i) + " " + Str(data(i))) 'ListBox2.Items.Add(Str(i) + " " + Str(pos(i))) Next i Cursor = System.Windows.Forms.Cursors.Arrow End Sub '順位を付ける 選択結合法 Private Sub SelectBind(Byval n As integer) Dim i As Integer Dim j As Integer Dim k As Integer Dim l As Integer Dim m As Integer Dim ct As Integer Dim max As Integer Dim n0 As Integer Dim nn As Integer Dim x As Single Dim sw As New Stopwatch Dim millisec As Long Dim dummy As Integer Dim pos(n + 10) As Integer Dim state(n + 10) As Integer Dim start As Integer ' 高分解能なタイマが利用可能か Console.WriteLine(Stopwatch.IsHighResolution) ' 出力例:True Cursor = System.Windows.Forms.Cursors.WaitCursor 'ストップウォッチを開始する sw.Reset() sw.Start() '最大値 max = data(1) For i = 1 To n If data(i) > max Then max = data(i) End If Next i 'ダミー配列 x = Math.Log(n) / Math.Log(2) nn = 2 ^ (Math.Ceiling(x)) For i = n + 1 To nn data(i) = max + 100 Next i n0 = n n = nn bn = n0 '境界値 'Dim pos(n + 10) As Integer 'Dim state(n + 10) As Integer Call rank() n = n0 'p(i)にはi番目に小さいデータの位置 ct = 1 i = 1 start = i j = p(i) k = p(j) p(j) = i state(j) = 1 Do i = k If i = start Then p(i) = j state(i) = 1 ct = ct + 1 If ct >= n Then Exit Do Do i = i + 1 If state(i) = 0 Then start = i l = p(i) Exit Do End If Loop Until i >= n If i >= n Then Exit Do End If Else l = p(i) p(i) = j state(i) = 1 ct = ct + 1 If ct >= n Then Exit Do End If j = l If j = start Then p(j) = i state(j) = 1 ct = ct + 1 If ct >= n Then Exit Do Do j = j + 1 If state(j) = 0 Then start = j k = p(j) Exit Do End If Loop Until j >= n If j >= n Then Exit Do End If Else k = p(j) p(j) = i state(j) = 1 ct = ct + 1 If ct >= n Then Exit Do End If Loop Until ct >= n '順位にもとづきソート m = 1 Do k = p(m) If p(m) = m Then m = m + 1 Else 'データ交換 dummy = data(m) data(m) = data(k) data(k) = dummy dummy = p(m) p(m) = p(k) p(k) = dummy End If Loop Until m > n For i = 1 To n pos(p(i)) = i Next i 'ストップウォッチを止める sw.Stop() '結果を表示する millisec = sw.ElapsedMilliseconds TextBox3.Text = Str(millisec) + " msec" '表示 ListBox2.Items.Clear() For i = 1 To n ListBox2.Items.Add(Str(i) + " " + Str(data(i))) 'ListBox2.Items.Add(Str(i) + " " + Str(pos(i))) Next i Cursor = System.Windows.Forms.Cursors.Arrow End Sub '順位をつける Private Sub rank() Dim i As Integer Dim j As Integer Dim m As Integer Dim num As Integer m = Log(n) / Log(2) 'データから2個選ぶ num = 1 For i = 1 To n Step 2 If data(i) < data(i + 1) Then p(num) = i num = num + 1 p(num) = i + 1 Else p(num) = i + 1 num = num + 1 p(num) = i End If num = num + 1 Next i num = 1 For i = 1 To n Step 2 If i > bn Then For j = bn To n p(j) = j Next j Exit For End If If data(i) < data(i + 1) Then p(num) = i num = num + 1 p(num) = i + 1 Else p(num) = i + 1 num = num + 1 p(num) = i End If num = num + 1 Next i Call ranking(0, m - 1, n / 4) End Sub Private Sub ranking(ByVal hosu As Integer, ByVal m As Integer, ByVal ct As Integer) Dim i As Integer Dim j As Integer Dim k As Integer Dim l As Integer Dim num As Integer Dim ll As Integer Dim kk As Integer Dim m0 As Integer Dim m1 As Integer Dim mh As Integer Dim mm As Integer Dim nn As Integer Dim dummy As Integer Dim pos(n + 10) As Integer hosu = hosu + 1 If hosu > m Then Exit Sub For j = 1 To n pos(j) = 0 Next j mh = 2 ^ hosu m0 = mh m1 = 2 * m0 k = 1 l = k + m0 num = 1 For i = 1 To ct Do If data((p(k))) <= data((p(l))) Then pos(k) = num k = k + 1 '境界越え If k > bn Then For kk = k To n pos(kk) = kk Next kk num = n Exit For End If If k > m0 Then For ll = l To m1 num = num + 1 pos(ll) = num Next ll Exit Do End If num = num + 1 Else pos(l) = num l = l + 1 '境界越え If l > bn Then For kk = k To m0 num = num + 1 pos(kk) = num Next kk For ll = l To m1 num = num + 1 pos(ll) = num Next ll Exit Do End If If l > m1 Then For kk = k To m0 num = num + 1 pos(kk) = num Next kk Exit Do End If num = num + 1 End If Loop Until k > m0 Or l > m1 k = m1 + 1 l = k + mh m0 = m0 + 2 * mh m1 = m1 + 2 * mh num = num + 1 Next i '途中の順位にもとづいて並び直す nn = m0 mm = 1 Do kk = pos(mm) If pos(mm) = mm Then mm = mm + 1 Else 'データ交換 dummy = p(mm) p(mm) = p(kk) p(kk) = dummy dummy = pos(mm) pos(mm) = pos(kk) pos(kk) = dummy End If Loop Until mm > n Call ranking(hosu, m, ct / 2) End Sub