Storing Elements in a Row

Cost of Shifting


연속된 배열의 가운데를 바꾸면 틈을 만들거나 닫기 위해 원소를 옮긴다. 이동 방향은 아직 읽지 않은 값을 보존하도록 정해진다.

삽입 이동n − i개를 오른쪽으로 옮긴다.
삭제 이동n − i − 1개를 왼쪽으로 옮긴다.
안전한 순서삽입은 뒤부터, 삭제는 앞부터 복사한다.

배열은 원소를 한 칸씩 복사해 자리를 만든다

현재 단계는 값을 읽는 원본 칸(source)과 값을 쓰는 대상 칸(destination)을 하나씩 표시한다. 단계가 진행될수록 누적 이동 수와 배열 내용이 함께 바뀐다.

위 줄은 배열 칸이고, 아래 두 상자는 이번 단계에서 값을 읽는 원본 칸과 값을 쓰는 대상 칸이다. 막대는 전체 이동 가운데 진행한 비율이다.

뒤 원소부터 빈 칸 쪽으로 복사해야 원본 칸의 원래 값이 남는다.

복사 방향을 잘못 고르면 아직 읽지 않은 값이 사라진다

위 절의 연산과 인덱스를 그대로 쓴다. 옮길 원소가 둘 이상이면 순서가 반대일 때 아직 읽지 않은 값이 사라진다.

안전한 순서

3 → 4, 2 → 3

오른쪽 끝에서 시작하므로 아직 복사하지 않은 a[2]가 남는다.

반대 순서

2 → 3부터 시작

a[3]의 d를 옮기기 전에 e가 그 칸을 덮어쓴다.

삽입은 n − i개, 삭제는 n − i − 1개를 옮긴다. 복사 순서는 이동 수가 아니라 데이터 보존을 결정한다.