並べかえプログラム

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]

である。

基礎プログラミング II / 2007 年度

Madoka Nishimura <madoka@e.koeki-u.ac.jp>