[์์ฑ์: ๋ ธํฌ์ฌ]
๐กย ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ์์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๊ธฐ๋ณธ์ด ๋๋ ๋ถ๋ถ์ผ๋ก,
๋ง์ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ค์ด ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์จ์ผ๋ง ํด๊ฒฐ์ด ๋๋ค๊ณ ํฉ๋๋ค.
๊ทธ์ค ์ฌ์ดํธ์ ์ํ๋ ์ธ๊ฐ์ง๋ฅผ ๋ค๋ค๋ณด๊ฒ ์ต๋๋ค.
๋ฒ๋ธ ์ ๋ ฌ์ ์ธ์ ํ ๋ ์์๋ฅผ ๊ฒ์ฌํ์ฌ ์ ๋ ฌํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
์๊ฐ ๋ณต์ก๋๊ฐ O(n^2) ์ผ๋ก ์๋นํ ๋๋ฆฌ์ง๋ง, ๋ฐ์ดํฐ๊ฐ ์ ์ ๋์ ์ฐ์
๋๋ค.
์์์ ์ด๋์ด ๊ฑฐํ์ด ์๋ฉด์ผ๋ก ์ฌ๋ผ์ค๋ ๋ฏํ ๋ชจ์ต์ ๋ณด์ด๊ธฐ ๋๋ฌธ์
Bubble Sort ๋ผ๋ ์ด๋ฆ์ด ์ง์ด์ก๋ค๊ณ ํฉ๋๋ค. (gif ์ฐธ๊ณ ๐ย )
์ด๋ฐ ๋ฐฐ์ด์ด ์๋ค๊ณ ๊ฐ์ ํ๊ณ ์์ํ๊ฒ ์ต๋๋ค.
๊ฐ์ฅ ์์ ์๋ ๋ ์์๋ฅผ ๋น๊ตํ๊ณ ,
5๊ฐ 2๋ณด๋ค ๋ ํฌ๋ฏ๋ก ๋ ์์์ ์๋ฆฌ๋ฅผ ๋ฐ๊ฟ์ค๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฐ๊พผ ์์น์์ ๊ทธ ์ ์์์ธ 6๊ณผ ๋น๊ตํฉ๋๋ค.
์ด๋ฒ์ 5๊ฐ 6๋ณด๋ค ์๋ค์? ์๋ฆฌ๋ฅผ ๋ฐ๊พธ์ง ์๊ณ ๊ทธ๋๋ก ๋ก๋๋ค.
๊ทธ ๋ค์์ 6๊ณผ 4๋ฅผ ๋น๊ตํ๊ณ , ์๋ฆฌ๋ฅผ ๋ฐ๊พธ๊ณ
6๊ณผ 1์ ๋น๊ตํ์ฌ ์๋ฆฌ๋ฅผ ~~......
์ด๋ฐ์์ผ๋ก ๋ฐ๋ณตํ์ฌ ๊ฐ์ฅ ํฐ ๊ฐ์ ๋์ผ๋ก ๋ณด๋ด๋ ๋ฐฉ์์ ๋๋ค.
๋ค์ ์ฒ์์ผ๋ก ๋์๊ฐ ๊ทธ ๋ค์ ํฐ ๊ฐ์ด ์๋ฆฌ์ ์ฌ ๋๊น์ง
for ๋ฌธ์ ๋ฐ๋ณตํ์ฌ ์์๋๋ก ์ ๋ ฌํฉ๋๋ค.
๋ค์์ ๋ฒ๋ธ ์ ๋ ฌ์ ์ฝ๋์
๋๋ค.
let arr = [5, 2, 6, 4, 1, 3];
const bubble = (arr, size) => {
for (let i = size - 1; i > 0; i--) { // ์ค๋ฅธ์ชฝ๋ถํฐ ์ฑ์๊ฐ๋ for ๋ฌธ
for (let j = 0; j < i; j++) { // ๋ฐฐ์ด์ ์ํํ๋ for ๋ฌธ
if (arr[j] > arr[j + 1]) { // j ์ธ๋ฑ์ค์ ๊ฐ์ด ๊ทธ ์ค๋ฅธ์ชฝ ๊ฐ๋ณด๋ค ํฌ๋ค๋ฉด
let swap = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = swap;
} // ex) j = 5, j+1 = 2 ๋ผ๋ฉด
} // swap ๋ณ์์ 5๋ฅผ ์ ์ฅํด๋๊ณ
} // j ์๋ฆฌ์ 2๋ฅผ, j+1 ์๋ฆฌ์ 5๋ฅผ ์ฎ๊ฒจ์ค๋ค
return arr;
}
console.log(bubble(arr, arr.length));
// [ 1, 2, 3, 4, 5, 6 ]
- Worst Case: O(n^2): ์ ๋ ฌ์ด ํ๋๋ ์๋์ด์๋ ๊ฒฝ์ฐ
- Best Case: O(n): ์ด๋ฏธ ์ ๋ ฌ์ด ๋์ด์๋ ๊ฒฝ์ฐ
๋ฒ๋ธ ์ ๋ ฌ์ ์ต์ ์ ๊ฒฝ์ฐ O(n^2)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋๋ค.
๊ฐ ์๋ฆฌ๋ฅผ ์ฐพ๊ธฐ ์ํด n๋ฒ์ ์ํ๋ฅผ ํด์ผํ๋ฉฐ
n๋ฒ์ ํ์ ๋์์ ์์์ ๊ฐ์๋งํผ ๋ ์ํ๋ฅผ ํด์ผํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๋ฌ๋ ์ด๋ฏธ ์ ๋ ฌ์ด ๋์ด์๋ ๊ฒฝ์ฐ์๋ ํ ๋ฒ์ ์ํ๋ก ์ ๋ ฌ ์ฌ๋ถ๋ฅผ ์ ์ ์์ต๋๋ค.
(but, ์ฐ๋ฆฌ์๊ฒ ์ฃผ์ด์ง๋ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ์์
์ด๋ฏธ ์๋ง๊ฒ ์ ๋ ฌ์ด ๋์ด์๋ ๊ฒฝ์ฐ๋ ์์ํ ๋ ์ฐ๋ฆฌ์๊ฒ Best Case ๋ ์๊ฒ ์ฃ ?
๊ทธ๋์ ์ ๊ฐ ๊ตฌํํด๋ ์ฝ๋์ break ๋ฌธ์ ์์ต๋๋ค,,๐ย )
์ ํ ์ ๋ ฌ์ ์ ์๋ฆฌ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋์ ๋๋ค.
์๊ณ ๋ฆฌ์ฆ์ด ๋จ์ํ๋ฉฐ, ์ฌ์ฉํ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ํ์ ์ผ ๊ฒฝ์ฐ ์ฉ์ดํฉ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ์ ๋ฐฐ์ด์ ๋๊ณ ์์ํ๊ฒ ์ต๋๋ค.
0๋ฒ์งธ ์๋ฆฌ์ ์์๋ฅผ ๋ฃ์ด์ค ์ฐจ๋ก๋ผ๋ฉด,
๋ชจ๋ ์์๋ฅผ ์ํํ๋ฉฐ ๊ฐ์ฅ ์์ ๊ฐ์ ๊ฐ์ง ์์๋ถํฐ ์ฐพ์๋ ๋๋ค.
๊ฐ์ฅ ๊ฐ์ด ์์ ์์๋ฅผ ์ฐพ์์ต๋๋ค!
๊ฐ์ฅ ์ ์๋ฆฌ๋ก ์์น๋ฅผ ๋ฐ๊ฟ์ค๋๋ค.
1๋ฒ์งธ ์๋ฆฌ์ ์์๋ฅผ ๋ฃ์ด์ค ์ฐจ๋ก์ธ๋ฐ,
์ด๋ฏธ ๊ทธ์ ๋ง๋ ์์๊ฐ ์์นํด ์์ผ๋ฏ๋ก
์ด๋ฒ์ Swap ๋์ง ์์ต๋๋ค.
์ด๋ฐ์์ผ๋ก n๋ฒ์งธ ์์ ๊ฐ์ ๊ฐ์ง ์์๋ฅผ ์ฐพ์๋ด๋ฉฐ
์์๋๋ก ๋ฐฐ์ด์ ์์น๊ฐ ๋ฐ๋ ๋๊น์ง for ๋ฌธ์ ๋ฐ๋ณตํฉ๋๋ค.
๋ค์์ ์ ํ ์ ๋ ฌ์ ์ฝ๋์ ๋๋ค.
let arr = [5, 2, 6, 4, 1, 3];
const bubble = (arr, size) => {
for (let i = size - 1; i > 0; i--) { // ์ค๋ฅธ์ชฝ๋ถํฐ ์ฑ์๊ฐ๋ for ๋ฌธ
for (let j = 0; j < i; j++) { // ๋ฐฐ์ด์ ์ํํ๋ for ๋ฌธ
if (arr[j] > arr[j + 1]) { // j ์ธ๋ฑ์ค์ ๊ฐ์ด ๊ทธ ์ค๋ฅธ์ชฝ ๊ฐ๋ณด๋ค ํฌ๋ค๋ฉด
let swap = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = swap;
} // ex) j = 5, j+1 = 2 ๋ผ๋ฉด
} // swap ๋ณ์์ 5๋ฅผ ์ ์ฅํด๋๊ณ
} // j ์๋ฆฌ์ 2๋ฅผ, j+1 ์๋ฆฌ์ 5๋ฅผ ์ฎ๊ฒจ์ค๋ค
return arr;
}
console.log(bubble(arr, arr.length));
// [ 1, 2, 3, 4, 5, 6 ]
- Worst Case: O(n^2): ์ ๋ ฌ์ด ํ๋๋ ์๋์ด์๋ ๊ฒฝ์ฐ
- Best Case: O(n^2): ์ด๋ฏธ ์ ๋ ฌ์ด ๋์ด์๋ ๊ฒฝ์ฐ
์ ํ ์ ๋ ฌ์ ์ด๋ฏธ ์ ๋ ฌ์ด ๋์ด์๋ ๊ฒฝ์ฐ์๋ O(n^2)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋๋ค.
๋งค๋ฒ ์ ํด์ง ์๋ฆฌ์ ์ฌ ์ ์๋ ์ต์๊ฐ์ ์ฐพ์์ผํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ด ๋งค์ฐ ๋จ์ด์ง๋๋ค.
์ฝ์ ์ ๋ ฌ์ ๋ฐ์ดํฐ๊ฐ ๋ง์์๋ก ํจ์จ์ด ๋จ์ด์ง์ง๋ง ๊ตฌํ์ด ๊ฐ๋จํ๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
์ด๋ฒ์๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ์ ๋ฐฐ์ด์ ๋๊ณ ์์ํ์ง๋ง,
์ฝ์ ์ ๋ ฌ์ 0๋ฒ์งธ ์ธ๋ฑ์ค๊ฐ ์๋ 1๋ฒ์งธ ์ธ๋ฑ์ค๋ถํฐ ์์ํฉ๋๋ค.
์ผ์ชฝ ์ธ๋ฑ์ค์ ๋น๊ต ํ์ ๋ ๊ฐ์ด ์๋ค๋ฉด
ํ์ฌ ์ธ๋ฑ์ค๋ฅผ ์ผ์ชฝ์ผ๋ก Swap ์ํต๋๋ค.
๊ทธ ๋ค์ ์ธ๋ฑ์ค์์ ๊ต์ฒดํ ํ์๊ฐ ์๋ค์!
์ด๋ํ์ง ์๊ณ ๊ทธ๋๋ก ๋ก๋๋ค.
๊ทธ๋ผ ๊ทธ ๋ค์ ์์์ธ 3๋ฒ์งธ ์ธ๋ฑ์ค์ ์์นํ ๊ฐ์ธ โ4โ ๋
6๊ณผ ์๋ฆฌ๋ฅผ ๋ฐ๊พธ๊ณ ์ฐ์์ผ๋ก 5์ ์๋ฆฌ๋ฅผ ๋ ๋ฐ๊พธ๊ฒ ์ฃ ?
์ด๋ฐ์์ผ๋ก ์ผ์ชฝ์ ํ์ฌ ์ธ๋ฑ์ค๋ณด๋ค ์์ ๊ฐ์ด ์์ง ์์ ๋๊น์ง
for ๋ฌธ๊ณผ while ๋ฌธ์ ๋ฐ๋ณตํ๋ฉฐ Swap ์์ผ์ค๋๋ค.
๋ค์์ ์ฝ์ ์ ๋ ฌ์ ์ฝ๋์ ๋๋ค.
let arr = [5, 2, 6, 4, 1, 3];
const insertion = (arr) => {
for (let i = 1; i < arr.length; i++) { //1๋ฒ์งธ ์ธ๋ฑ์ค๋ถํฐ ์ํ
let cur = arr[i]; // ํ์ฌ i ๋ฒ์งธ ๊ฐ
let left = i - 1; // i ๋ฒ์งธ์ ์ผ์ชฝ ๊ฐ
while (left >= 0 && arr[left] > cur) { // left ๊ฐ์ด ํด ๋ ๋ฐ๋ณต
arr[left + 1] = arr[left]; // left ๊ฐ์ ํ๋์ฉ ์ค์ฌ๊ฐ๋ฉฐ ์ผ์ชฝ๊ณผ ๋น๊ต
left--;
}
arr[left + 1] = cur; // ๊ตํ์ด ๋๋๋ฉด ๋งจ ์ ์ธ๋ฑ์ค์ cur ๊ฐ์ ๋ฃ์ด์ค
}
return arr;
}
console.log(insertion(arr));
// [ 1, 2, 3, 4, 5, 6 ]
- Worst Case: O(n^2): ์ ๋ ฌ์ด ํ๋๋ ์๋์ด์๋ ๊ฒฝ์ฐ
- Best Case: O(n): ์ด๋ฏธ ์ ๋ ฌ์ด ๋์ด์๋ ๊ฒฝ์ฐ
์ฝ์ ์ ๋ ฌ์ ๋ฒ๋ธ ์ ๋ ฌ๊ณผ ๋๊ฐ์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง์ง๋ง
ํ์ํ ๋ฐ์ดํฐ๋ง ์ค์บํ๊ธฐ ๋๋ฌธ์ ์์ ๋๊ฐ์ง ๋ฐฉ์๋ณด๋ค ๋น ๋ฅด๋ค๋ ์ฅ์ ์ ๊ฐ์ง๋๋ค.
์ฌ์ค ์ต์ , ์ต๊ณ ์ ๊ฒฝ์ฐ๋ ์์ฃผ ๋ฐ์ํ์ง ์๊ธฐ ๋๋ฌธ์
์๊ฐ๋ณต์ก๋๋ Worst ์ Best ๋ณด๋จ Average ๋ฅผ ๋ณด๋ ๊ฒ์ด ์ข ๋ ์ณ๋ค๊ณ ํฉ๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก ๋์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ง๋ง,
์ฝ์ > ์ ํ > ๋ฒ๋ธ ์์ผ๋ก ๋ซ๋ค๊ณ ๋ณผ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค!