Scratch シェアソート課題3
課題内容
スペースキーでリストをシェアソートを用いて昇順に並び替え
解答
解答を表示する
背景
変更①変更②変更③
定義 変数初期化
↓↓↓↓↓
定義 変数初期化 [状態 v]を[未整列]にする [天秤左場所 v]を(0)にする [天秤右場所 v]を(0)にする [選択行 v]を(0)にする [選択列 v]を(0)にする [行数 v]を((([リスト v]の長さ::list)の[平方根 v]::operators)の[切り下げ v]::operators)にする [列数 v]を((([リスト v]の長さ::list)/(行数))の[切り下げ v]::operators)にする [余り v]を(([リスト v]の長さ::list)-((行数)*(列数)))にする もし<<<(余り)>(0)>かつ<((行数)を(2)で割った余り)=(1)>>かつ<(行数)>(1)>>なら [行数 v]を(-1)ずつ変える [列数 v]を((([リスト v]の長さ::list)/(行数))の[切り下げ v]::operators)にする [余り v]を(([リスト v]の長さ::list)-((行数)*(列数)))にする end
定義 シェアソート
↓↓↓↓↓
定義 シェアソート [ソート回数 v]を(((((行数)の[log v]::operators)/((2)の[log v]::operators))の[切り上げ v]::operators)+(1))にする (ソート回数)回繰り返す [選択行 v]を(1)にする (行数)回繰り返す バブルソート((((選択行)-(1))*(列数))+(1))((選択行)*(列数))((選択行)を(2)で割った余り)(1)::custom [選択行 v]を(1)ずつ変える end もし<(余り)>(0)>なら バブルソート((((選択行)-(1))*(列数))+(1))([リスト v]の長さ::list)((選択行)を(2)で割った余り)(1)::custom end [選択列 v]を(1)にする (余り)回繰り返す バブルソート(選択列)(((行数)*(列数))+(選択列))(1)(列数)::custom [選択列 v]を(1)ずつ変える end ((列数)-(余り))回繰り返す バブルソート(選択列)((((行数)-(1))*(列数))+(選択列))(1)(列数)::custom [選択列 v]を(1)ずつ変える end end [選択行 v]を(1)にする (行数)回繰り返す バブルソート((((選択行)-(1))*(列数))+(1))((選択行)*(列数))(1)(1)::custom [選択行 v]を(1)ずつ変える end もし<(余り)>(0)>なら バブルソート((((選択行)-(1))*(列数))+(1))([リスト v]の長さ::list)(1)(1)::custom end
定義 バブルソート(開始場所)(終了場所)(順序)(間隔)
↓↓↓↓↓
定義 バブルソート(開始場所)(終了場所)(順序)(間隔) [終端 v]を(開始場所)にする [符号 v]を(((順序)*(2))-(1))にする ((((終了場所)-(開始場所))/(間隔))+(1))回繰り返す [選択場所 v]を(終了場所)にする (((終了場所)-(終端))/(間隔))回繰り返す [天秤左場所 v]を((選択場所)-(間隔))にする [天秤左値 v]を([リスト v]の(天秤左場所)番目)にする [天秤右場所 v]を(選択場所)にする [天秤右値 v]を([リスト v]の(天秤右場所)番目)にする もし<((天秤左値)*(符号))<((天秤右値)*(符号))>なら [リスト v]の(天秤左場所)番目を(天秤右値)で置き換える [リスト v]の(天秤右場所)番目を(天秤左値)で置き換える [最終交換場所 v]を(選択場所)にする end [選択場所 v]を((間隔)*(-1))ずつ変える end [終端 v]を(間隔)ずつ変える end
解説
解説を表示する
背景
変更①変更②変更③
定義 変数初期化
定義「変数初期化」が呼び出されたとき、スクリプトを開始する
[状態 v]を[未整列]にする [天秤左場所 v]を(0)にする [天秤右場所 v]を(0)にする [選択行 v]を(0)にする [選択列 v]を(0)にする [行数 v]を((([リスト v]の長さ::list)の[平方根 v]::operators)の[切り下げ v]::operators)にする [列数 v]を((([リスト v]の長さ::list)/(行数))の[切り下げ v]::operators)にする [余り v]を(([リスト v]の長さ::list)-((行数)*(列数)))にする もし<<<(余り)>(0)>かつ<((行数)を(2)で割った余り)=(1)>>かつ<(行数)>(1)>>なら [行数 v]を(-1)ずつ変える [列数 v]を((([リスト v]の長さ::list)/(行数))の[切り下げ v]::operators)にする [余り v]を(([リスト v]の長さ::list)-((行数)*(列数)))にする end
変数の初期設定
定義 シェアソート
定義「シェアソート」が呼び出されたとき、スクリプトを開始する
[ソート回数 v]を(((((行数)の[log v]::operators)/((2)の[log v]::operators))の[切り上げ v]::operators)+(1))にする end
(ソート回数)回繰り返す
ソート回数繰り返す
[選択行 v]を(1)にする (行数)回繰り返す バブルソート((((選択行)-(1))*(列数))+(1))((選択行)*(列数))((選択行)を(2)で割った余り)(1)::custom [選択行 v]を(1)ずつ変える もし<(余り)>(0)>なら バブルソート((((選択行)-(1))*(列数))+(1))([リスト v]の長さ::list)((選択行)を(2)で割った余り)(1)::custom end
1行ずつ交互に昇順・降順バブルソートする
[選択列 v]を(1)にする (余り)回繰り返す バブルソート(選択列)(((行数)*(列数))+(選択列))(1)(列数)::custom [選択列 v]を(1)ずつ変える end ((列数)-(余り))回繰り返す バブルソート(選択列)((((行数)-(1))*(列数))+(選択列))(1)(列数)::custom [選択列 v]を(1)ずつ変える end
1列ずつ交互に昇順バブルソートする
[選択行 v]を(1)にする (行数)回繰り返す バブルソート((((選択行)-(1))*(列数))+(1))((選択行)*(列数))(1)(1)::custom [選択行 v]を(1)ずつ変える end もし<(余り)>(0)>なら バブルソート((((選択行)-(1))*(列数))+(1))([リスト v]の長さ::list)(1)(1)::custom end
1行ずつ昇順バブルソートする
定義 バブルソート(開始場所)(終了場所)(順序)(間隔)
定義「バブルソート」が呼び出されたとき、スクリプトを開始する
[選択場所 v]を(終了場所)にする
変数「選択場所」を格納する
(((終了場所)-(終端))/(間隔))回繰り返す end
変数「選択場所」が変数「開始場所」または変数「終了場所」まで繰り返す
[天秤左場所 v]を((選択場所)-(間隔))にする [天秤左値 v]を([リスト v]の(天秤左場所)番目)にする [天秤右場所 v]を(選択場所)にする [天秤右値 v]を([リスト v]の(天秤右場所)番目)にする
天秤で計る場所と値を変数「天秤左場所」・「天秤左値」・「天秤右場所」・「天秤右値」に格納する
もし<((天秤左値)*(符号))<((天秤右値)*(符号))>なら [リスト v]の(天秤左場所)番目を(天秤右値)で置き換える [リスト v]の(天秤右場所)番目を(天秤左値)で置き換える [最終交換場所 v]を(選択場所)にする end
向きによってを条件を変え、リストの「天秤左場所」番目と「天秤右場所」番目の値を入れ替え、最終交換場所を格納する
[選択場所 v]を((間隔)*(-1))ずつ変える
変数「選択場所」を次の位置にする
[終端 v]を(間隔)ずつ変える
変数「終端」を次の位置にする