アルゴリズムとプログラミング

基本情報技術者試験整列」の問題

アルゴリズムとプログラミングアルゴリズムとプログラミング計算問題難易度:hard
次の擬似言語はシェルソートの一部であり、間隔 gap を 4 として、間隔 gap だけ離れた要素どうしを挿入ソートで整列する 1 段階分の処理である。arr = {9, 5, 7, 1, 8, 3, 6, 2}(要素数 8、添字は 1 から)を与えて、この gap=4 の処理を実行した後の配列 arr の内容はどれか。
○手続: shellPass(整数型の配列: arr, 整数型: gap)
  整数型: i, j, key
  for (i を gap + 1 から arrの要素数 まで 1 ずつ増やす)
    key ← arr[i]
    j ← i
    while (j > gap かつ arr[j - gap] > key)
      arr[j] ← arr[j - gap]
      j ← j - gap
    endwhile
    arr[j] ← key
  endfor
{1, 2, 3, 5, 6, 7, 8, 9}
{8, 3, 6, 1, 9, 5, 7, 2}
{9, 5, 7, 1, 8, 3, 6}
{8, 3, 6, 1, 90, 5, 7, 2}
正解
{8, 3, 6, 1, 9, 5, 7, 2}

gap=4 のシェルソート 1 段階では添字差 4 の組 {arr[1],arr[5]}={9,8}, {arr[2],arr[6]}={5,3}, {arr[3],arr[7]}={7,6}, {arr[4],arr[8]}={1,2} を各々昇順にする。各組を入れ替えると {8,3,6,1,9,5,7,2} となるため イが正しい。

?選択肢ごとの解説

ア ×全体が完全に昇順整列されており、gap=1 まで進めた最終結果と取り違えた誤りである。1 段階では到達しない。
イ ○gap=4 のシェルソート 1 段階では添字差 4 の組 {arr[1],arr[5]}={9,8}, {arr[2],arr[6]}={5,3}, {arr[3],arr[7]}={7,6}, {arr[4],arr[8]}={1,2} を各々昇順にする。各組を入れ替えると {8,3,6,1,9,5,7,2} となるため イが正しい。
ウ ×要素が 7 個に減っており、ペアの一方を消失させた、間隔処理の取り違えによる誤りである。
エ ×arr[5] の値を 9 ではなく 90 と桁誤りしており、シフト時に値を改変した誤りである。

くわしく

シェルソートは大きな間隔から始めて遠く離れた要素を先に整え、徐々に gap を縮める。gap=4 の 1 段階で動くのは添字差が gap の組だけであり、組ごとに独立した小さな挿入ソートが行われる点が核心である。

本番での押さえどころ

試験のコツ

gap だけ離れた要素を線で結び、結ばれた組の中だけで大小を比較する。

覚え方

『遠くから粗く、近くで細かく』とシェルソートの段階を覚える。

よくある誤り

隣接要素まで動かしてしまう、または 1 段階で全体が整列すると誤認するミスが多い。

アルゴリズムとプログラミングの他の問題

この問題を、AIの8-ways解説つきで。

基本情報技術者試験の演習を、一問ごとに「なぜ」まで。まずは無料で。

無料ではじめる →

ukamiru 過去問 · 基本情報技術者試験 · fe-b-algo-0066

【基本情報技術者試験】整列の問題 — 解答・解説|ukamiru 過去問