[問題]
マージソートの変形版として,以下のようなアルゴリズムを実現せ
よ.プログラムは数のリスト lstを引数として,与えると以下のアル
ゴリズムでソートした列を返すものとする.実現する関数はkadai
(lst)として定義せよ.
1. キューにlstのそれぞれの要素を個別にリストにしてそれぞ
れ入れておく.
2. キューの長さが2以上である間以下の動作を繰り返す:
キューから2つ要素を取り出して,その2つの要素を
マージし,結果をキューに付け加える.
3. キューの唯一の要素を結果として返す.
マージソートのプログラムは以下の通りです。
function merge(lst1, lst2){
var lst = []
while (true){
if (lst1.length == 0) return lst.concat(lst2)
else if (lst2.length == 0) return lst.concat(lst1)
if (lst1[0] < lst2[0]) lst.push(lst1.shift())
else lst.push(lst2.shift())
}
}
function msort(lst){
var n = lst.length
if (n < 2) return lst
else {
var n2 = Math.floor(n / 2)
return merge(
msort(lst.slice(0, n2)), msort(lst.slice(n2, n)))
}
}
m = [7,3,5,4,1,2,4]
puts(m)
puts(msort(m))
ちなみに、実行環境は学校のホームページのものを使っています。
ちなみに、完成すると以下のような出力になるみたいです。
[出力結果]
7,3,5,4,1,2,4
3,7
4,5
1,2
4
1,2,3,4,4,5,7