挿入ソートで今まで、前半の配列取得を、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.new
と
arr = []
の2つですが、どちらでも問題なさそうです。
この辺はJavascriptに似てますね。
デバッグ表示
前回まではputs関数を使っていたんですが、今回からprint文を使っています。
理由としては、配列表示が縦並びではなく、横並びの配列表示で出てくれるからですね。
でも、文末に改行を追記してあげないと行けないので使うときは要注意です。
関連リンク
いろいろなプログラム言語でアルゴリズム学習
0 件のコメント:
コメントを投稿