ascending order๋ก ์ ๋ ฌํ๋ qseudocode๋ ๋ค์๊ณผ ๊ฐ๋ค.
(index๊ฐ 1๋ถํฐ n๊น์ง๋ผ๊ณ ๊ฐ์ ํ์ ๋)
INSERTION-SORT(A, n) -> A[1 .. n]
for j <- 2 to n
do key <- A[j]
i <- j-1
while i > 0 and A[i] > key
do A[i+1] <- A[i]
i <- i-1
A[i+1] = key
python ์ฝ๋
์์ qseudo code๋ฅผ python์ผ๋ก ์ง ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค. (์ธ๋ฑ์ค๋ ์๋๋๋ก 0๋ถํฐ)
def insertion_sort(A):
n = len(A) # ๋ฆฌ์คํธ์ ๊ธธ์ด ๊ณ์ฐ
for j in range(1, n): # ๋๋ฒ์งธ๋ถํฐ ๋ฐฐ์ด์ ๋ง์ง๋ง ์์๊น์ง
key = A[j]
i = j - 1
while i >= 0 and A[i] > key:
A[i + 1] = A[i]
i -= 1
A[i + 1] = key
# ํ
์คํธ
lst = [5, 3, 2, 4, 1]
insertion_sort(lst)
print(lst)
๊ทธ๋ฆผ์ผ๋ก ์๊ฐํ๋ค๋ฉด,
key๊ฐ์ ์๋ ์์น์ ๋ ์์ ๊ฐ์ ๋ฃ๊ณ ,
๋น๊ณต๊ฐ์ ๋๋๋ฉฐ ํ ์นธ์ฉ ๋ฐ๋ค๊ฐ
A[i+1]์ key๊ฐ์ ๋ค์ ๋์ ํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
Loop invariant (๋ฃจํ ๋ถ๋ณ์ฑ)
์๊ณ ๋ฆฌ์ฆ์์๋ ํญ์ ์ฌ๋ฐ๋ฅธ ๊ฐ์ ๋์ถํ๋์ง๋ฅผ ํ์ธํด์ผ ํ๋ค.
์๊ณ ๋ฆฌ์ฆ์ ์ค์ํ ํํธ๊ฐ ๋ฐ๋ณต๋ฌธ์ด๋ผ๋ฉด, ๊ทธ ๋ถ๋ถ์ Loop invariants(๋ฃจํ ๋ถ๋ณ์ฑ)์ ํตํด ์ฆ๋ช ํ ์ ์๋ค.
๋ฐ๋ณตํ๋ ๋์ ๋ถ๋ณํ๋ state๊ฐ ๋ฌด์์ธ์ง ํ์ ํ๊ณ , Initialization, Maintenance, Termination์ผ๋ก ๋๋ ์ state๊ฐ ์ ์ง๋๋์ง ํ์ ํ๋ค.
induction(๊ท๋ฉ๋ฒ)๊ณผ ๋น์ทํ ํํ์ ์ฆ๋ช ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
Maintenance ์์ ํนํ ์ฃผ์๋ฅผ ํด์ผํ๋๋ฐ, ์ผ๋ฐ์ ์ธ ํน์ ์ซ์๋ฅผ ๋์ ํด๋ณด๋ ๊ฒ์ด ์๋๋ผ k๋ผ๋ฉด k+1๋ฒ์งธ๊ฐ ํญ์ ์ฑ๋ฆฝํ๋์ง๋ฅผ induction ์ฆ๋ช ๊ณผ ๊ฐ์ด ์ฆ๋ช ํด์ผ ํ๋ค. value ๊ฐ์ด ์๋ index๋ก ์ฆ๋ช ํด์ผ ํ๋ ๊ฒ์ด๋ค.