quicksort のプログラムは次のようになる。 quicksort.rb
#!/usr/koeki/bin/ruby # 並べかえ部分 def quicksort(number) # number 配列を受け取る if number.length <= 1 # カードが残り 1 枚以下なら、number は数値が入る number # 数値そのものを返して並べ換え完了 else left = Array.new # 左側の山配列 left を新規作成 right = Array.new # 右側の山配列 right を新規作成 k = number.shift # number 配列の先頭を取り出して k に代入 for x in number # 残った number 配列全てに対して繰り返す if x < k # k より小さかったら left << x # 左側の山配列 left に追加 else right << x # 右側の山配列 right に追加 end end # quicksort(left) と k と quicksort(right) をくっつけたものが最終結果 quicksort(left) + [k] + quicksort(right) # kは要素なので[]で括って配列にする end end # 並べるときに関する method def readNumArray() array = [] # 並べる時に使う置場を配列 array と考える while line=gets # 入力が続く間 datum = line.chomp!.to_i # 整数に直して array.push(datum) # 配列 arrayに追加していく end array # 最後にできあがった array を返す end # 並べかえ後についての method def printArray(a) printf("[%s]\n", a.join(", ")) end STDERR.puts "カードを記録して下さい(終了は Ctrl-d):" array = readNumArray() STDERR.puts "整列前:" printArray(array) puts "整列後:" puts "小さな順に並べました" printArray(quicksort(array))
構造は次のようになっている。
def quicksort(number) # 定義 1 # 数字を並べ変える方法について end def readNumArray() # 定義 2 # 入力した数値をどのように配列にくっつけるか end def printArray(a) # 定義 3 # 入力した数字を表示する方法について end # 配列を用意 # 入力した数値を表示 # 入れ替えた数値を表示
配列の操作が使われている。動かし方は
% ./quicksort.rb 8 2 1 3 5 4 9 6 7 Ctrl-D 整列前: [6, 2, 3, 5, 7, 9, 8, 1, 4] 整列後: [1, 2, 3, 4, 5, 6, 7, 8, 9]
である。
Madoka Nishimura <madoka@e.koeki-u.ac.jp>