Scratch マージソート課題3
課題内容
スペースキーでリストをマージソートを用いて昇順に並び替え
解答
解答を表示する
背景
変更①変更②
定義 変数初期化
↓↓↓↓↓
定義 変数初期化 [状態 v]を[未整列]にする [前半 v]のすべてを削除する [後半 v]のすべてを削除する
定義 マージソート(上)(下)
↓↓↓↓↓
定義 マージソート(上)(下) もし<(上)<(下)>なら マージソート(上)((((上)+(下))/(2))の[切り下げ v]::operators) マージソート(((((上)+(下))/(2))の[切り下げ v]::operators)+(1))(下) [前半 v]のすべてを削除する [後半 v]のすべてを削除する [中央 v]を((((上)+(下))/(2))の[切り下げ v]::operators)にする [前半 v]を(((中央)-(上))+(1))にする [後半 v]を((下)-(中央))にする [選択場所 v]を(上)にする (前半::variables)回繰り返す [選択値 v]を([リスト v]の(選択場所)番目)にする (選択値)を[前半 v]に追加する [選択場所 v]を(1)ずつ変える end (後半::variables)回繰り返す [選択値 v]を([リスト v]の(選択場所)番目)にする (選択値)を[後半 v]に追加する [選択場所 v]を(1)ずつ変える end [選択場所 v]を(上)にする [前半選択場所 v]を(1)にする [後半選択場所 v]を(1)にする <<([前半 v]の長さ::list)<(前半選択場所)>または<([後半 v]の長さ::list)<(後半選択場所)>>まで繰り返す [前半選択場所 v]を([リスト v]の(前半選択場所)番目)にする [後半選択場所 v]を([リスト v]の(後半選択場所)番目)にする もし<(前半選択値)<(後半選択値)>なら [リスト v]の(選択場所)番目を(前半選択値)で置き換える [選択場所 v]を(1)ずつ変える [前半選択場所 v]を(1)ずつ変える でなければ [リスト v]の(選択場所)番目を(後半選択値)で置き換える [選択場所 v]を(1)ずつ変える [後半選択場所 v]を(1)ずつ変える end end <([前半 v]の長さ::list)<(前半選択場所)>まで繰り返す [前半選択値 v]を([前半 v]の(前半選択場所)番目)にする [リスト v]の(選択場所)番目を(前半選択値)で置き換える [選択場所 v]を(1)ずつ変える [前半選択場所 v]を(1)ずつ変える end <([後半 v]の長さ::list)<(後半選択場所)>まで繰り返す [後半選択値 v]を([前半 v]の(後半選択場所)番目)にする [リスト v]の(選択場所)番目を(後半選択値)で置き換える [選択場所 v]を(1)ずつ変える [後半選択場所 v]を(1)ずつ変える end end
解説
解説を表示する
背景
変更①変更②
定義 変数初期化
定義「変数初期化」が呼び出されたとき、スクリプトを開始する
[状態 v]を[未整列]にする [前半 v]のすべてを削除する [後半 v]のすべてを削除する
変数の初期設定
定義 マージソート(上)(下)
定義「マージソート」が呼び出されたとき、スクリプトを開始する
もし<(上::custom)<(下::custom)>なら end
ソート範囲が0になるまで繰り返す
マージソート(上)((((上)+(下))/(2))の[切り下げ v]::operators)::custom マージソート(((((上)+(下))/(2))の[切り下げ v]::operators)+(1))(下)::custom
半分ずつ分けてをさらにマージソートする。
[前半 v]のすべてを削除する [後半 v]のすべてを削除する [中央 v]を((((上)+(下))/(2))の[切り下げ v]::operators)にする
リスト「前半」と「後半」をリセットして、範囲の中央の場所を変数「中央場所」に格納する
[前半 v]を(((中央)-(上))+(1))にする [後半 v]を((下)-(中央))にする [選択場所 v]を(上)にする (前半::variables)回繰り返す [選択値 v]を([リスト v]の(選択場所)番目)にする (選択値)を[前半 v]に追加する [選択場所 v]を(1)ずつ変える end (後半::variables)回繰り返す [選択値 v]を([リスト v]の(選択場所)番目)にする (選択値)を[後半 v]に追加する [選択場所 v]を(1)ずつ変える end
前半部分と後半部分を、リスト「前半」と「後半」に分ける
[選択場所 v]を(上)にする [前半選択場所 v]を(1)にする [後半選択場所 v]を(1)にする <<([前半 v]の長さ::list)<(前半選択場所)>または<([後半 v]の長さ::list)<(後半選択場所)>>まで繰り返す [前半選択場所 v]を([リスト v]の(前半選択場所)番目)にする [後半選択場所 v]を([リスト v]の(後半選択場所)番目)にする もし<(前半選択値)<(後半選択値)>なら [リスト v]の(選択場所)番目を(前半選択値)で置き換える [選択場所 v]を(1)ずつ変える [前半選択場所 v]を(1)ずつ変える でなければ [リスト v]の(選択場所)番目を(後半選択値)で置き換える [選択場所 v]を(1)ずつ変える [後半選択場所 v]を(1)ずつ変える end end <([前半 v]の長さ::list)<(前半選択場所)>まで繰り返す [前半選択値 v]を([前半 v]の(前半選択場所)番目)にする [リスト v]の(選択場所)番目を(前半選択値)で置き換える [選択場所 v]を(1)ずつ変える [前半選択場所 v]を(1)ずつ変える end <([後半 v]の長さ::list)<(後半選択場所)>まで繰り返す [後半選択値 v]を([前半 v]の(後半選択場所)番目)にする [リスト v]の(選択場所)番目を(後半選択値)で置き換える [選択場所 v]を(1)ずつ変える [後半選択場所 v]を(1)ずつ変える end
リスト「前半」と「後半」を比べて順に上書きする。