
ハク
配列って、どこに何が動いてるのか分からなくなるんだよね……

レイ
今回は”左に1つずつずらす”処理を図で理解していきましょう
問題
次の配列があります。(配列の要素は1から始まります。)
{1, 2, 3, 4, 5}
これを、
{2, 3, 4, 5, 1}
に変更したい問題です。
つまり、
- 全体を左に1つずらす
- 先頭の「1」を最後へ移動する
という処理ですね。
プログラム
整数型の配列:array ← {1, 2, 3, 4, 5}
整数型:i, tmp
tmp ← array[1]
for(i を 1 から a まで 1ずつ増やす)
b
endfor
array[arrayの要素数] ← tmp
この a と b に何が入るかを考えます。
まずは最初の1行を見る
tmp ← array[1]

ハク
なんで最初に保存してるの?

レイ
左にずらすと、先頭の値が消えてしまうからです。
今の配列は:
1 2 3 4 5
このままずらすと「1」が消えてしまいます。
だから先に tmp に保存しておくんですね。
tmp = 1
左にずらすってどういうこと?
実際に動かしてみましょう!
現在:
1 2 3 4 5
↓
こうしたい:
2 3 4 5 ?
つまり、
array[1] ← array[2]
array[2] ← array[3]
array[3] ← array[4]
array[4] ← array[5]
という動きをしています。
b に入る内容

レイ
左シフトでは、“右の値を左へコピー”します。
つまり:
array[i] ← array[i + 1]
これが b に入ります。
a はどこまで?

ハク
最後までやっちゃダメなの?
もし i = 5 まで行くと、
array[5] ← array[6]
になります。
でも array[6] は存在しません!
だから、
arrayの要素数 - 1
までにします。
正解
- a → (arrayの要素数 – 1)
- b → array[i] ← array[i + 1]
実際の動き
初期状態
1 2 3 4 5
tmp に 1 を保存。
i = 1
array[1] ← array[2]
↓
2 2 3 4 5
i = 2
array[2] ← array[3]
↓
2 3 3 4 5
i = 3
↓
2 3 4 4 5
i = 4
↓
2 3 4 5 5
最後に tmp を入れる
array[5] ← tmp
↓
2 3 4 5 1
完成!

ハク
左右どっちか分からなくなるんだよね……

レイ
そんな時は、“どこへコピーするか”を見るんです。
左シフト
array[i] ← array[i+1]
右の値を左へ持ってくる。
右シフト
array[i+1] ← array[i]
左の値を右へ持っていく。
まとめ

ハク
今回のポイント!
- 最初の値は tmp に保存する
- 左シフトは
array[i] ← array[i+1] - 配列外アクセスを防ぐため「要素数 – 1」まで

ハク
図で追うとかなり分かりやすいね!

レイ
配列問題は“実際に動かす”のが最強です。


コメント