[Algorithm] ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ๊ธฐ๋ณธ (๋ฒ๋ธ/์ ํ/์ฝ์ )
๐ก ์์์ ๋ชจ๋ input์ [10, 7, 9, 5, 1]
๋ก ํต์ผ. ๋ฒ๋ธ / ์ ํ / ์ฝ์
์ ๋ ฌ ๋ชจ๋ ์ต์
์ ๊ฒฝ์ฐ O(n²)
์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ๋๋ค. ์๊ณ ๋ฆฌ์ฆ ์ฑ๋ฅ์ด ์ข์ง ์์ ๊ฑฐ์ ์ฐ์ง ์์ง๋ง, ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํ ๋ ์ ์ฉ.
๋ฒ๋ธ ์ ๋ ฌ | Bubble Sort
๊ฑฐํ์ด ์ผ์ด๋ ๊ฒ์ฒ๋ผ ๋ฐฐ์ด์ ๊ฐ ์์๋ค์ด ์์ฐจ์ ์ผ๋ก ์ ๋ ฌ๋ผ์ ๋ฒ๋ธ ์ ๋ ฌ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ๋ ์์๋ฅผ ๋ฌถ์ด์ ๋น๊ตํ ํ ํฐ ์ซ์๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ฐ์ด๋ธ๋ค. i
๋ฒ์งธ ์ ๋ ฌ์ ๋ง์น ๋๋ง๋ค “๋ค์์ i
๋ฒ์งธ” ์๋ฆฌ์ ์์๊ฐ ํ์ ๋๋ค.
์๊ฐ ๋ณต์ก๋ (์ฝ์ ์ ๋ ฌ๊ณผ ๋์ผ)
- Worst Case(์ ๋ ฌ์ด ์ ํ ์๋์ ๋) :
O(n²)
— ์ค์ฒฉ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ๋ฏ๋ก - Best Case(์ด๋ฏธ ์ ๋ ฌ๋์ ๋) :
O(n)
์ฅ๋จ์ (์ฝ์ ์ ๋ ฌ๊ณผ ๋์ผ)
Stable ์ ๋ ฌ : ์ค๋ณต ๋ฐ์ดํฐ๋ ์์๋ฅผ ๋ฐ๊พธ์ง ์๋ ๋ฐฉ์(Unstable ์ ๋ ฌ์ ์ค๋ณต ๋ฐ์ดํฐ๋ ์์ ๋ฐ๊ฟ)
In-place ์ ๋ ฌ : ์๋ก์ด ๋ฐฐ์ด ์์ฑ ์์ด ๊ธฐ์กด ๋ฐฐ์ด๋ง ์ฌ์ฉํ๊ฑฐ๋, ์ถฉ๋ถํ ๋ฌด์ํ ๋งํ ์ ์ฅ ๊ณต๊ฐ๋ง ๋ ์ฌ์ฉํ๋ ์ ๋ ฌ ๋ฐฉ์(Not In-place ์ ๋ ฌ์ ์์ ๊ฐ์์ ๋น๋กํ๋ ์ ์ฅ๊ณต๊ฐ์ ๋ ์ฌ์ฉํจ)
- ์ฅ์ : ๊ตฌํํ๊ธฐ ์ฝ๊ณ ,
in place
์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ๋จ.stable
์ ๋ ฌ ๋ฐฉ์ - ๋จ์ : ์๋ฃ ๊ฐ์๊ฐ ๋ง์์ง์๋ก ์ฑ๋ฅ์ด ํ์ ํ๊ฒ ๋จ์ด์ง. ex) ์๋ฃ๊ฐ 100๊ฐ๋ผ๋ฉด 10000๋ฒ ์ํ
๊ตฌํ
i
๋ฅผ ํ ๋ฒ ์ํํ ๋๋ง๋ค(์์ชฝ for
๋ฌธ ๋ชจ๋ ์ํ) ๋ฐฐ์ด์ ๊ฐ์ฅ ํฐ ์์(์ซ์)๊ฐ ๋ง์ง๋ง ์ธ๋ฑ์ค๋ก ๋ฐ๋ ค๋๋ฏ๋ก ๋ ๋ฒ์งธ for
๋ฌธ j
์กฐ๊ฑด์์์ i
๋ฅผ ๋นผ๋ฉด ๋ถํ์ํ ์ํ๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
const bubbleSort = (arr) => {
for (let i = 0; i < arr.length - 1; i++) {
for (let j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]; // swap
}
}
}
return arr;
};
bubbleSort([10, 7, 9, 5, 1]); // [1, 5, 7, 9, 10]
i = 0, j ์ต๋ 3(arr.length - 1 - i)
========================
j = 0 : [7, 10, 9, 5, 1]
j = 1 : [7, 9, 10, 5, 1]
j = 2 : [7, 9, 5, 10, 1]
j = 3 : [7, 9, 5, 1, 10]
i = 1, j ์ต๋ 2
========================
j = 0 : [7, 9, 5, 1, 10]
j = 1 : [7, 5, 9, 1, 10]
i = 2 : [7, 5, 1, 9, 10]
i = 2, j ์ต๋ 1
========================
j = 0 : [5, 7, 1, 9, 10]
j = 1 : [5, 1, 7, 9, 10]
i = 3, j ์ต๋ 0
========================
j = 0 : [1, 5, 7, 9, 10]
๋ฐฐ์ด ๋ ์์์ ์์๋ฅผ ๋ฐ๊พธ๋ swap ์ฝ๋๋ ์๋์ ๋์ผํ๋ค.
if (arr[j] > arr[j + 1]) {
// [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
let temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
์ ํ ์ ๋ ฌ | Selection Sort
i
์ธ๋ฑ์ค ์์น์ ์ฌ ์์๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ ("์ ํ"ํ ์์น์ ์ฌ ์์๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ)
์ ํ ์ ๋ ฌ์ i
์ธ๋ฑ์ค ์์๋ณด๋ค ์์ ์ต์๊ฐ์ ์ฐพ์ ํ i
์ธ๋ฑ์ค ์์์ ๊ตํํ๋ ์์
์ ๋ฐ๋ณตํ๋ฉฐ ์ ๋ ฌํ๋ ๋ฐฉ์์ด๋ค. ๋ฒ๋ธ ์ ๋ ฌ์ i
๋ฒ์งธ ์ํ๊ฐ ๋๋ ๋๋ง๋ค “๋ค์์” i
๋ฒ์งธ ์๋ฆฌ์ ์์๊ฐ ์ ํด์ง๋ ๋ฐ๋ฉด, ์ ํ ์ ๋ ฌ์ i
๋ฒ์งธ ์ํ๊ฐ ๋๋ ๋๋ง๋ค “์์์” i
๋ฒ์งธ ์๋ฆฌ์ ์์๊ฐ ์ ํด์ง๋ค.
์๊ฐ ๋ณต์ก๋
- Worst Case(์ ๋ ฌ์ด ์ ํ ์๋์ ๋) :
O(n²)
- Best Case(์ด๋ฏธ ์ ๋ ฌ๋์ ๋) :
O(n²)
์ฅ๋จ์
- ์ฅ์ : ๊ตฌํํ๊ธฐ ์ฝ๊ณ
in place
์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ - ๋จ์ : ์ฑ๋ฅ์ด ๋งค์ฐ ๋จ์ด์ง, ์ค๋ณต ๋ฐ์ดํฐ๋ ์์น๊ฐ ๋ฐ๋ ์ ์๋
unstable
์ ๋ ฌ ๋ฐฉ์
๊ตฌํ
const selectionSort = (arr) => {
for (let i = 0; i < arr.length; i++) {
let min = i;
for (let j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[min]) {
min = j;
}
}
if (min !== i) {
[arr[i], arr[min]] = [arr[min], arr[i]]; // swap
}
}
return arr;
};
selectionSort([10, 7, 9, 5, 1]); // [1, 5, 7, 9, 10]
i = 0 / min = 0
===============
j = 1 : min = 1
j = 2 : min = 1
j = 3 : min = 3
j = 4 : min = 4
---------------
i !== min -> [1, 7, 9, 5, 10]
i = 1 / min = 1
===============
j = 2 : min = 1
j = 3 : min = 3
j = 4 : min = 3
---------------
i !== min -> [1, 5, 9, 7, 10]
i = 2 / min = 2
===============
j = 3 : min = 3
j = 4 : min = 3
---------------
i !== min -> [1, 5, 7, 9, 10]
i = 3 / min = 3
===============
j = 4 : min = 3
---------------
i === min -> [1, 5, 7, 9, 10]
์ฝ์ ์ ๋ ฌ | Insertion Sort
i
์ธ๋ฑ์ค์ ์์๊ฐ ์ฝ์ ๋ ์์น๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ
์ฝ์ ์ ๋ ฌ์ 2๋ฒ์งธ(1๋ฒ ์ธ๋ฑ์ค) ์์๋ถํฐ ์์ํด์ ์ผ์ชฝ์ ์๋ ์์์ ๋น๊ตํ ํ, ์ผ์ชฝ ์์๊ฐ ๋ ํฌ๋ค๋ฉด ์์น๋ฅผ ๋ฐ๊พธ๋ ์์ (Swap)์ ๋ฐ๋ณตํ๋ฉฐ ์ ๋ ฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ๋ฒ๋ธ ์ ๋ ฌ, ์ ํ ์ ๋ ฌ๋ณด๋ค ํจ์จ์ ์ด๋ค.
1๋ฒ ์ธ๋ฑ์ค๋ถํฐ ๋น๊ต ์์ํด์ ์ผ์ชฝ ๊ฐ์ด ๋ ํฌ๋ฉด Swap / ์์ผ๋ฉด i++
---------------------------------------------------
i = 1 : 0 ๋ฒ ์ธ๋ฑ์ค์ ๋น๊ต
i = 2 : 1 → 0 ๋ฒ ์ธ๋ฑ์ค์ ๋น๊ต
i = 3 : 2 → 1 → 0 ๋ฒ ์ธ๋ฑ์ค์ ๋น๊ต
...
์๊ฐ ๋ณต์ก๋ (๋ฒ๋ธ ์ ๋ ฌ๊ณผ ๋์ผ)
- Worst Case(์ ๋ ฌ์ด ์ ํ ์๋์ ๋) :
O(n²)
— ์ค์ฒฉ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ๋ฏ๋ก - Best Case(์ด๋ฏธ ์ ๋ ฌ๋์ ๋) :
O(n)
์ฅ๋จ์ (๋ฒ๋ธ ์ ๋ ฌ๊ณผ ๋์ผ)
- ์ฅ์ : ๊ตฌํํ๊ธฐ ์ฝ๊ณ ,
in place
์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ๋จ.stable
์ ๋ ฌ ๋ฐฉ์ - ๋จ์ : ์๋ฃ ๊ฐ์๊ฐ ๋ง์์ง์๋ก ์ฑ๋ฅ์ด ํ์ ํ๊ฒ ๋จ์ด์ง. ex) ์๋ฃ๊ฐ 100๊ฐ๋ผ๋ฉด 10000๋ฒ ์ํ
๊ตฌํ
const insertionSort = (arr) => {
for (let i = 1; i < arr.length; i++) {
let j = i;
while (j > 0 && arr[j - 1] > arr[j]) {
// arr[j] ์ผ์ชฝ ์์๊ฐ ๋ ํฐ์ง ํ์ธ
[arr[j], arr[j - 1]] = [arr[j - 1], arr[j]]; // swap
j--;
}
}
return arr;
};
insertionSort([10, 7, 9, 5, 1]); // [1, 5, 7, 9, 10]
i = 1
========================
j = 1 : [7, 10, 9, 5, 1]
i = 2
========================
j = 2 : [7, 9, 10, 5, 1]
i = 3
========================
j = 3 : [7, 9, 5, 10, 1]
j = 2 : [7, 5, 9, 10, 1]
j = 1 : [5, 7, 9, 10, 1]
i = 4
========================
j = 4 : [5, 7, 9, 1, 10]
j = 3 : [5, 7, 1, 9, 10]
j = 2 : [5, 1, 7, 9, 10]
j = 1 : [1, 5, 7, 9, 10]
๋ ํผ๋ฐ์ค
- [JS/Sorting] ๋ฒ๋ธ ์ ๋ ฌ, ์ฝ์ ์ ๋ ฌ, ์ ํ ์ ๋ ฌ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๊ตฌํํ๊ธฐ
- ZeroCho Blog
- Common Sorting Algorithms in JavaScript
๊ธ ์์ ์ฌํญ์ ๋ ธ์ ํ์ด์ง์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ฐ์๋ฉ๋๋ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Algorithm] ํต ์ ๋ ฌ(Quick Sort) ์๊ณ ๋ฆฌ์ฆ ํบ์๋ณด๊ธฐ (0) | 2024.05.07 |
---|---|
[Algorithm] ๋ถํ ์ ๋ณต / ๋ณํฉ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ (0) | 2024.05.07 |
[React] ๋ฆฌ์กํธ Suspense ํบ์๋ณด๊ธฐ (0) | 2024.05.06 |
[Git] ์๋ฉด ์ ์ฉํ GitHub ๋จ์ถํค / ํ (0) | 2024.05.05 |
[TS] ํ์ ์คํฌ๋ฆฝํธ ์ ์ฝ ์กฐ๊ฑด๊ณผ ์กฐ๊ฑด๋ถ ํ์ (0) | 2024.05.05 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[Algorithm] ํต ์ ๋ ฌ(Quick Sort) ์๊ณ ๋ฆฌ์ฆ ํบ์๋ณด๊ธฐ
[Algorithm] ํต ์ ๋ ฌ(Quick Sort) ์๊ณ ๋ฆฌ์ฆ ํบ์๋ณด๊ธฐ
2024.05.07 -
[Algorithm] ๋ถํ ์ ๋ณต / ๋ณํฉ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
[Algorithm] ๋ถํ ์ ๋ณต / ๋ณํฉ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
2024.05.07 -
[React] ๋ฆฌ์กํธ Suspense ํบ์๋ณด๊ธฐ
[React] ๋ฆฌ์กํธ Suspense ํบ์๋ณด๊ธฐ
2024.05.06 -
[Git] ์๋ฉด ์ ์ฉํ GitHub ๋จ์ถํค / ํ
[Git] ์๋ฉด ์ ์ฉํ GitHub ๋จ์ถํค / ํ
2024.05.05