์ฝ์
์ ๋ ฌ
์ฝ์
์ ๋ ฌ(Insertion Sort)
0. ๊ฐ์
- โญ๋ ๋ฒ์งธ ์์๋ถํฐ ์์ํ์ฌ ๊ทธ ์์ ์์๋ค๊ณผ ๋น๊ตํ์ฌ ์ฝ์
ํ ์์น๋ฅผ ์ง์ ํ ํ, ์์๋ฅผ ๋ค๋ก ์ฎ๊ธฐ๊ณ ์ง์ ๋ ์๋ฆฌ์ ์๋ฃ๋ฅผ ์ฝ์
ํ์ฌ ์ ๋ ฌํ๋ ์๊ณ ๋ฆฌ์ฆ
- ์ค๋ฆ์ฐจ์์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ.
- ๋ง์ฝ, ๋ด๋ฆผ์ฐจ์์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๊ณ ์ถ๋ค๋ฉด ๋ถ๋ฑํธ ๋ฐ๋๋ฐฉํฅ
1. ์ฝ์
์ ๋ ฌ(Insertion Sort)์ด๋?
- ์ ์์ ์นด๋๋ฅผ ์ ๋ ฌํ๋ ๋ฐฉ๋ฒ๊ณผ ์ ์ฌ
- ์๋ก์ด ์นด๋๋ฅผ ๊ธฐ์กด์ ์ ๋ ฌ๋ ์นด๋ ์ฌ์ด์ ์ฌ๋ฐ๋ฅธ ์๋ฆฌ์ ์ฝ์
- ์๋ก ์ฝ์
๋ ์นด๋์ ์๋งํผ ๋ฐ๋ณตํ๊ฒ ๋๋ฉด ์ ์ฒด ์นด๋ ์ ๋ ฌ๋จ
- ์๋ฃ ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ฅผ ์์์๋ถํฐ ์ฐจ๋ก๋๋ก ์ด๋ฏธ ์ ๋ ฌ๋ ๋ฐฐ์ด ๋ถ๋ถ๊ณผ ๋น๊ตํ์ฌ, ์์ ์ ์์น๋ฅผ ์ฐพ์ ์ฝ์
ํจ์ผ๋ก์จ ์ ๋ ฌ์ ์์ฑ
- ๋งค ์์๋ง๋ค ํด๋น ์์๋ฅผ ์ฝ์
ํ ์ ์๋ ์์น๋ฅผ ์ฐพ์ ํด๋น ์์น์ ๋ฃ๋๋ค.
2. ์ฝ์
์ ๋ ฌ(insertion sort)์๊ณ ๋ฆฌ์ฆ์ ๊ตฌ์ฒด์ ๊ฐ๋
- โญ์ฝ์
์ ๋ ฌ์ ๋ ๋ฒ์งธ ์๋ฃ๋ถํฐ ์์ํ์ฌ ๊ทธ ์(์ผ์ชฝ)์ ์๋ฃ๋ค๊ณผ ๋น๊ตํ์ฌ ์ฝ์
ํ ์์น๋ฅผ ์ง์ ํ ํ ์๋ฃ๋ฅผ ๋ค๋ก ์ฎ๊ธฐ๊ณ ์ง์ ํ ์๋ฆฌ์ ์๋ฃ๋ฅผ ์ฝ์
ํ์ฌ ์ ๋ ฌํ๋ ์๊ณ ๋ฆฌ์ฆ.
- ์ฆ, ๋ ๋ฒ์งธ ์๋ฃ๋ ์ฒซ ๋ฒ์งธ ์๋ฃ, ์ธ ๋ฒ์งธ ์๋ฃ๋ ๋ ๋ฒ์งธ์ ์ฒซ ๋ฒ์งธ ์๋ฃ, ๋ค ๋ฒ์งธ ์๋ฃ๋ ์ธ ๋ฒ์งธ, ๋ ๋ฒ์งธ, ์ฒซ ๋ฒ์งธ ์๋ฃ์ ๋น๊ตํ ํ ์๋ฃ๊ฐ ์ฝ์
๋ ์์น๋ฅผ ์ฐพ๋๋ค. โญ์๋ฃ๊ฐ ์ฝ์
๋ ์์น๋ฅผ ์ฐพ์๋ค๋ฉด ๊ทธ ์์น์ ์๋ฃ๋ฅผ ์ฝ์
ํ๊ธฐ ์ํด ์๋ฃ๋ฅผ ํ ์นธ์ฉ ๋ค๋ก ์ด๋์ํจ๋ค.
3. ์ฝ์
์ ๋ ฌ(insertion sort) ์๊ณ ๋ฆฌ์ฆ ์์
- ๋ฐฐ์ด์ 8, 5, 6, 2, 4๊ฐ ์ ์ฅ๋์ด ์๋ค๊ณ ๊ฐ์ ํ๊ณ ์๋ฃ๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํด๋ณด๊ธฐ.
4. ์ฝ์
์ ๋ ฌ(insertion sort) ์ฝ๋
1. C์ธ์ด
# include <stdio.h>
# define MAX_SIZE 5
void insertion_sort(int list[], int n){
int i, j, key;
for(i=1; i<n; i++){
key = list[i];
for(j=i-1; j>=0 && list[j]>key; j--){
list[j+1] = list[j];
}
list[j+1] = key;
}
}
void main(){
int i;
int n = MAX_SIZE;
int list[n] = {8, 5, 6, 2, 4};
insertion_sort(list, n);
for(i=0; i<n; i++){
printf("%d\n", list[i]);
}
}
2. Python ์ฝ๋
def insertion_sort(arr):
for end in range(1, len(arr)):
for i in range(end, 0, -1):
if arr[i - 1] > arr[i]:
arr[i - 1], arr[i] = arr[i], arr[i - 1]
3. Java ์ฝ๋
public class Insertion {
public static void sort(int[] arr) {
for (int end = 1; end < arr.length; end++) {
for (int i = end; i > 0; i--) {
if (arr[i - 1] > arr[i])
swap(arr, i - 1, i);
}
}
}
private static void swap(int[] arr, int a, int b) {
int tmp = arr[a];
arr[a] = arr[b];
arr[b] = tmp;
}
}
4. Java ์ง์ ๊ตฌํํด๋ณด๊ธฐ
static void insertionSort(int[] arr) {
int key = 0;
int j = 0;
for(int i=1; i<arr.length; i++) {
key = arr[i];
j = i-1;
while(j>=0 && arr[j]>key) {
arr[j+1] = arr[j];
arr[j] = key;
j--;
}
}
}
- โญ
j=i-1
๊ณผ j=i--
์ ์ ํ ๋ค๋ฅธ ๋ด์ฉ์ด๋ค. ํ์๋ ์ฆ๊ฐ์ฐ์ฐ์๊ฐ ๋จผ์ ์ ์ฉ๋ ๋ค์ j์ ๊ฐ์ ์ ์ฅ๋๋ฏ๋ก, ๊ฒฐ๊ตญ i์ ๊ฐ์ด ๋ณํ ๋ฟ๋๋ผ j์ ๊ฐ๋ ๋์ผํ ๊ฐ์ผ๋ก ๋ฐ๋๋ค.
- ๐ก
arr[j+1]=arr[j]
๋น๊ต์ ๊ธฐ์ค์๋ฅผ ๋ฐ๋์ ์๊ฐํด์ผ ํ๋ค. ๋น๊ต ๊ธฐ์ค์ ์ธ๋ฑ์ค๊ฐ ํ ์นธ์ฉ ์ค์ด๋ ๋ค๋ฉด ๋น๊ต ๋์๋ ํ ์นธ์ฉ ์ค์ด ๋ค์ด์ผ ํ๋ค. arr[j+1]=arr[i]
๋ ์ผํ ๋น์ทํด๋ณด์ด์ง๋ง, i๊ฐ ๋ฃจํ๋ฌธ ๋ฐ๊นฅ์์ ๊ณ ์ ๋๋ค๋ ์ ์์ ์ ํ ๋ค๋ฅด๋ค. (์ฒ์ ์์ํ ๋๋ง i๊ฐ j๋ณด๋ค 1 ํฐ ๊ฐ์ธ ๊ฒ)
5. ์ฝ์
์ ๋ ฌ(insertion sort) ์๊ณ ๋ฆฌ์ฆ ํน์ง
1. ์ฅ์
- ์์ ํ ์ ๋ ฌ ๋ฐฉ๋ฒ
- ๋ ์ฝ๋ ์๊ฐ ๋จน์ ๊ฒฝ์ฐ ์๊ณ ๋ฆฌ์ฆ ์์ฒด๊ฐ ๋งค์ฐ ๊ฐ๋จํ๋ฏ๋ก ๋ค๋ฅธ ๋ณต์กํ ์ ๋ ฌ ๋ฐฉ๋ฒ๋ณด๋ค ์ ๋ฆฌํ ์ ์๋ค.
- ๋๋ถ๋ถ์ ๋ ์ฝ๋๊ฐ ์ด๋ฏธ ์ ๋ ฌ๋์ด ์๋ ๊ฒฝ์ฐ์ ๋งค์ฐ ํจ์จ์
2. ๋จ์
- ๋น๊ต์ ๋ง์ ๋ ์ฝ๋๋ค์ ์ด๋์ ํฌํจํ๋ค.
- ๋ ์ฝ๋ ์๊ฐ ๋ง๊ณ ๋ ์ฝ๋ ํฌ๊ธฐ๊ฐ ํด ๊ฒฝ์ฐ์ ์ ํฉํ์ง ์๋ค.
3. ๊ทธ ์ธ
- ๋ฐฐ์ด ๋ด์์ ๊ตํํ๋ ๋ฐฉ์์ด๋ฏ๋ก ๊ณต๊ฐ๋ณต์ก๋๋ O(1)์ด๋ค. ๊ธฐ๊ปํด์ผ ์์๋ฅผ ๊ตํํ ๋ ์ฐ์ผ ์์๋ณ์ ์ ๋์ ์ถ๊ฐ๊ณต๊ฐ๋ง ํ์ํ๋ฏ๋ก in-place ์ ๋ ฌ์ด๋ค.
- ํ๊ท ๊ณผ ์ต์
์ ์๊ฐ๋ณต์ก๋๋ O(n^2)์ด๋ค.
- ์ฝ์
์ ๋ ฌ์ ์ค๋ณต๋ ํค ๊ฐ์ ์์๊ฐ ์ ๋ ฌ ํ์๋ ์ ์ง๋๋ฏ๋ก stable ์ ๋ ฌ์ด๋ค.
- ์ ํ ์ ๋ ฌ์ด๋ ๋ฒ๋ธ ์ ๋ ฌ์ ๋นํด ์๋์ ์ผ๋ก ๋น ๋ฅด๋ค.
6. ์ฝ์
์ ๋ ฌ์ ์๊ฐ๋ณต์ก๋
1. ์ต์ ์ ๊ฒฝ์ฐ
- ๋น๊ต ํ์
- ์ด๋ ์์ด 1๋ฒ์ ๋น๊ต๋ง ์ด๋ฃจ์ด์ง๋ค.
- ์ธ๋ถ ๋ฃจํ: (n-1)๋ฒ
- Best T(n) = O(n)
2. ์ต์
์ ๊ฒฝ์ฐ(์
๋ ฅ ์๋ฃ๊ฐ ์ญ์์ผ ๊ฒฝ์ฐ)
- ๋น๊ต ํ์
- ์ธ๋ถ ๋ฃจํ ์์ ๊ฐ ๋ฐ๋ณต๋ง๋ค i๋ฒ์ ๋น๊ต ์ํ
- ์ธ๋ถ ๋ฃจํ: (n-1)+(n-2)+...+2+1 = n(n-1)/2 = O(n^2)
- ๊ตํ ํ์
- ์ธ๋ถ ๋ฃจํ์ ๊ฐ ๋จ๊ณ๋ง๋ค (i+2)๋ฒ์ ์ด๋ ๋ฐ์
- n(n-1)/2+2(n-1)=(n^2+3n-4)/2 = O(n^2)
- WorstT(n) = O(n^2)
7. ์ต์ ํ
- โญ๊ธฐ์กด์ ์๋ ๊ฐ๋ค์ ์ด์ ํจ์ค์์ ๋ชจ๋ ์ ๋ ฌ๋์๋ค๋ ์ ์ ํ์ฉํ๋ฉด ๋ถํ์ํ ๋น๊ต ์์
์ ์ ๊ฑฐํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด, ์๋์ ๊ฐ์ด ๊ธฐ์กด ์ ๋ ฌ ๋ฒ์ [1, 2, 3, 5]์ 4๊ฐ ์๋กญ๊ฒ ์ถ๊ฐ๋๋ค๋ฉด, 5๋ 4๋ณด๋ค ํฌ๊ธฐ ๋๋ฌธ์ swap์ด ํ์ํ์ง๋ง, 3์ 4๋ณด๋ค ์๊ธฐ ๋๋ฌธ์ swap์ด ํ์์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ 3๋ณด๋ค ์์ ์๋ ์ซ์๋ค์ ๊ธฐ์กด ํจ์ค์์ ์ด๋ฏธ ์ ๋ ฌ์ ํด๋์๊ธฐ ๋๋ฌธ์ ๋น์ฐํ 3๋ณด๋ค๋ ์์ ๊ฒ์ด๋ฉฐ, ๋ ์ด์์ 4์ ๋์ ๋น๊ต๋ ๋ฌด์๋ฏธํฉ๋๋ค. ์ด ์ฌ์ค์ ์ด์ฉํ๋ฉด, ์๋กญ๊ฒ ์ถ๊ฐ๋ ๊ฐ๋ณด๋ค ์์ ์ซ์๋ฅผ ๋ง๋๋ ์ต์ด์ ์๊ฐ๊น์ง๋ง ๋ด๋ถ ๋ฐ๋ณต๋ฌธ์ ์ํํด๋ ๋ฉ๋๋ค.
[1, 2, 3, 5, 4, ...]: 5 > 4 => swap
* * * * ^
[1, 2, 3, 4, 5, ...]: 3 < 4 => OK => all sorted!
* * * * *
1. Python ์ฝ๋
def insertion_sort(arr):
for end in range(1, len(arr)):
i = end
while i > 0 and arr[i - 1] > arr[i]:
arr[i - 1], arr[i] = arr[i], arr[i - 1]
i -= 1
2. Java ์ฝ๋
public class Insertion {
public static void sort(int[] arr) {
for (int end = 1; end < arr.length; end++) {
int i = end;
while (i > 0 && arr[i - 1] > arr[i]) {
swap(arr, i - 1, i);
i--;
}
}
}
private static void swap(int[] arr, int a, int b) {
int tmp = arr[a];
arr[a] = arr[b];
arr[b] = tmp;
}
}
- โญ์ด ์ต์ ํ๋ฅผ ์ ์ฉํ๋ฉด, ์ ๋ ฌ๋ ๋ฐฐ์ด์ด ๋ค์ด์ฌ ๊ฒฝ์ฐ, O(N)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๋ฌ์ฑํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ด 5๊ฐ์ ์ซ์๊ฐ ๋ ๋ฐฐ์ด์ด ๋ค์ด์ค๋ฉด ๊ฐ ํจ์ค ๋น ๋จ ํ ๋ฒ ์ด 4๋ฒ์ ๋น๊ต๋ง์ผ๋ก ํด๋น ๋ฐฐ์ด์ด ์์ ํ ์ ๋ ฌ๋์์์ ์์๋ด๊ณ ์ฝ์
์ ๋ ฌ์ ์๋ฃํ ์ ์์ต๋๋ค.
[1, 2]: 1 < 2 => all sorted!
[1, 2, 3]: 2 < 3 => all sorted!
[1, 2, 3, 4]: 3 < 4 => all sorted!
[1, 2, 3, 4, 5]: 4 < 5 => all sorted!
8. ์ถ๊ฐ ์ต์ ํ
- โญswap ์์
์์ด ๋จ์ํ ๊ฐ๋ค์ shift ์ํค๋ ๊ฒ๋ง์ผ๋ก๋ ์ฝ์
์ ๋ ฌ์ ๊ตฌํ์ด ๊ฐ๋ฅํฉ๋๋ค. ์์ ๊ฐ์ด ์ ๋ ฌ ๋ฒ์์ ์ถ๊ฐ์ํจ ๊ฐ๋ณด๋ค ํด ๊ฒฝ์ฐ ์์ ๊ฐ์ ๋ค๋ก ๋ฐ๋ค๊ฐ ์ต์ด๋ก ์์ ๊ฐ์ ๋ง๋๋ ์๊ฐ ๊ทธ ๋ค์ ์ถ๊ฐ๋ ๊ฐ์ ๊ผฝ์ผ๋ฉด ๋ฉ๋๋ค.
def insertion_sort(arr):
for end in range(1, len(arr)):
to_insert = arr[end]
i = end
while i > 0 and arr[i - 1] > to_insert:
arr[i] = arr[i - 1]
i -= 1
arr[i] = to_insert
public class Insertion {
public static void sort(int[] arr) {
for (int end = 1; end < arr.length; end++) {
int toInsert = arr[end];
int i = end;
while (i > 0 && arr[i - 1] > toInsert) {
arr[i] = arr[i - 1];
i--;
}
arr[i] = toInsert;
}
}
}
9. ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ์๊ฐ๋ณต์ก๋ ๋น๊ต
- ๋จ์(๊ตฌํ ๊ฐ๋จ)ํ์ง๋ง ๋นํจ์จ์ ์ธ ๋ฐฉ๋ฒ
: ์ฝ์
์ ๋ ฌ, ์ ํ ์ ๋ ฌ, ๋ฒ๋ธ ์ ๋ ฌ
- ๋ณต์กํ์ง๋ง ํจ์จ์ ์ธ ๋ฐฉ๋ฒ
: ํต ์ ๋ ฌ, ํ ์ ๋ ฌ, ํฉ๋ณ ์ ๋ ฌ, ๊ธฐ์ ์ ๋ ฌ
์ถ์ฒ
- [์๊ณ ๋ฆฌ์ฆ] ์ฝ์
์ ๋ ฌ(insertion sort)์ด๋
- ์ฝ์
์ ๋ ฌ(Insertion Sort)
- [์๊ณ ๋ฆฌ์ฆ] ์ฝ์
์ ๋ ฌ - Insertion Sort (Python, Java)
- ์ธ์ค์
์ํธ ์ฝ์
์ ๋ ฌ 5๋ถ๋ง์ ์ดํดํ๊ธฐ - Gunny