第42問 小さい順に並べかえる(となりと交換)
配列 data(=[5,3,8,1])を小さい順(1,3,5,8)に並べかえよう。となりどうし data[j] と data[j + 1] をくらべて、順番が逆なら2つを入れかえます。入れかえるときは、先に片方の値を temp によけておいてから移すのがコツです。よけずに上書きすると値が消えてしまうことに気をつけよう(3か所の穴をうめよう)
難易度:★★★★★(5/難しい)。共通テスト「情報I」で使われるDNCL(共通テスト用プログラム表記)の穴埋め問題です。JavaScriptを有効にすると、このページでプログラムを組み立てて実行しながら解けます。
プログラム
data = [5,3,8,1]
i を 0 から 2 まで 1 ずつ増やしながら繰り返す:
j を 0 から 2 - i まで 1 ずつ増やしながら繰り返す:
もし data[j] [A] data[j + 1] ならば:
temp = data[j]
data[j] = [B]
data[j + 1] = [C]
表示する(data)
空欄 [A]・[B]・[C] に当てはまるものを、次の選択肢から選びます。
選択肢
>
<
temp
data[j]
data[j + 1]
ヒント
2つの値の交換は3手です。①temp に data[j] をよける ②data[j] に data[j + 1] を入れる ③data[j + 1] に temp をもどす。比べるのは、左が右より大きいとき(>)だけ入れかえれば小さい順になります
解答
- 空欄 [A] …
>
- 空欄 [B] …
data[j + 1]
- 空欄 [C] …
temp
よくある間違い
- [A]
> [B]data[j + 1] [C]data[j] … よけておいた temp を使わないのがおしい点です。data[j] に data[j + 1] を入れた時点で、data[j] は新しい値に変わっています。そのあと data[j + 1] に data[j] を入れると、同じ値が2つ並んでしまいます([5,3,8,1] の最初で [3,3,8,1] になる)。もどす先には temp を使います
- [A]
> [B]temp [C]data[j + 1] … temp には data[j] と同じ値が入っているので、data[j] に temp を入れても何も変わりません。data[j + 1] に data[j + 1] を入れるのも同じです。つまり1回も入れかわらず、[5,3,8,1] のまま出てきます。左には相手の値、右には temp をいれましょう
- [A]
> [B]data[j] [C]temp … data[j] に data[j] を入れても値は変わりません。そのあと data[j + 1] に temp(=大きいほうの値)が入るので、大きいほうが2つに増えて小さいほうが消えます([5,3,8,1] の最初で [5,5,8,1])。左には data[j + 1] を入れます
- [A]
> [B]temp [C]temp … どちらにも temp を入れると、となり合う2つが同じ値(大きいほう)になってしまいます([5,3,8,1] の最初で [5,5,8,1])。交換は「相手の値を自分に」「自分の値(temp)を相手に」の2手です
- [A]
< [B]data[j + 1] [C]temp … < だと「左が右より小さいとき」に入れかえるので、大きい順(8,5,3,1)に並んでしまいます。小さい順にしたいので、左のほうが大きいとき= > のときに入れかえます
- [A]
< [B]data[j + 1] [C]data[j] … 2か所ちがいます。小さい順にするなら比べるのは >、もどす先は temp です。temp を使わないと、上書きしたあとの値を移すことになり同じ値が2つ並びます
ほかの問題