[アルゴリズム] 挿入ソートの実装(Ruby編)

2017/02/03

Python テクノロジー プログラミング 特集

t f B! P L
挿入ソートで今まで、前半の配列取得を、if文使って、breakして配列作成していたんですが、今回のrubyコーディングをしていて、for文のstart-endで調整するだけでいいという事に気が付きました。 今まで使っていたif文は、全く無意味だったという事ですね・・・orz でも、何度も同じコードを記述しているからこそ気がついたんですが、改めてコードレビューという作業とリファクタリングという作業は重要だと気が付きました。 え?いまさら・・・と思うかもしれませんが、こういうのって自分でやって初めて気がつくものなんですね。

ソースコード

# 基本関数 def insertSort(numbers) # 数値配列を最初から順番に評価していく (1).step(numbers.count-1 , 1) { |i| # 確定数値リストを取得 confirmLists = getConfirmLists(numbers , i) # 対象外の数値リストを取得 lastLists = getLastLists(numbers , i) # 確定数値リストに対象数値が挿入される位置を取得する replaceNum = getInsertPlace(confirmLists , numbers[i]) # 確定数値リストに挿入数値の挿入 firstLists = setInsert(confirmLists , numbers[i] , replaceNum); # リストの結合 numbers = setUnionLists(firstLists , lastLists) } numbers end # 全体数値リストから確定数値リストを取得 def getConfirmLists(numbers , targetNum) arr = Array.new (0).step(targetNum-1 , 1){ |i| arr.push(numbers[i]) } arr end # 対象外の数値リストを取得 def getLastLists(numbers , targetNum) arr = Array.new (targetNum+1).step(numbers.count-1 , 1){ |i| arr.push(numbers[i]) } arr end # 確定数値リストに対象数値が挿入される位置を取得する def getInsertPlace(confirmLists , targetNum) num = confirmLists.count (0).step(confirmLists.count-1 ,1){ |i| if targetNum < confirmLists[i] then num = i break end } num end # 数値リストの挿入 def setInsert(confirmLists , targetNum , replaceNum) # 挿入操作 arr = [] (0).step(confirmLists.count-1 ,1){ |i| if i == replaceNum then arr.push(targetNum) end arr.push(confirmLists[i]); } # 挿入番号がnullの場合は入れ替えなし if replaceNum == confirmLists.count then arr.push(targetNum) end arr end # リストの結合 def setUnionLists(firstLists , lastLists) arr = [] if firstLists.count >0 then (0).step(firstLists.count-1 , 1){ |i| arr.push(firstLists[i]) } end if lastLists.length >0 then (0).step(lastLists.count-1 , 1){ |i| arr.push(lastLists[i]) } end arr end print insertSort([10,2,12,7,16,8,13]) ,"\n"

実行

$ ruby insertSort.rb [2, 7, 8, 10, 12, 13, 16]

解説

配列定義

空の配列を作成する時の記述を2パターン書いています。 arr = Array.newarr = [] の2つですが、どちらでも問題なさそうです。 この辺はJavascriptに似てますね。

デバッグ表示

前回まではputs関数を使っていたんですが、今回からprint文を使っています。 理由としては、配列表示が縦並びではなく、横並びの配列表示で出てくれるからですね。 でも、文末に改行を追記してあげないと行けないので使うときは要注意です。

関連リンク

いろいろなプログラム言語でアルゴリズム学習

人気の投稿

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。

ブログ アーカイブ