ํ์ดํธ๋ณด๋๋ ์ข ์ด๋ ๋น์ฅฌ์ผ ์คํ๋์ค์ ์์ฑํ๋ฉด์ ์ค๋ช ํ ์ ์์ด์ผ ํฉ๋๋ค.
๋ฒ๋ธ, ์ฝ์ , ์ ํ ์๊ณ ๋ฆฌ์ฆ์ ๋ชจ๋ ๊ธฐ๋ณธ์ ์ธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก, ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์ ๋ํด์๋ ๋นํจ์จ์ ์ผ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ฐ๋จํ ์ฌ์ฉ ์ฌ๋ก๋ ์์ ๋ฐ์ดํฐ์ ์๋ ์ฌ์ ํ ์ ์ฉํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ๊ฐ ์ด๋ฏธ ๋ถ๋ถ์ ์ผ๋ก ์ ๋ ฌ๋์ด ์๊ฑฐ๋, ๋ฐ์ดํฐ์ ์์ด ์ ์ ๋๋ ์ฝ์ ์ ๋ ฌ์ด ๋ค๋ฅธ ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋นํด ๋ ๋น ๋ฅผ ์ ์์ต๋๋ค. ํฉ๋ณ ์ ๋ ฌ์ ๋ชจ๋ ๊ฒฝ์ฐ์์ O(NlogN) ์ ์๊ฐ ๋ณต์ก๋๋ฅผ ์ ์งํ์ง๋ง, ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ ์๊ตฌ์ ์บ์ ํจ์จ ๋ฌธ์ ๋ก ์ธํด ํ๊ท ์ ์ธ ์ฑ๋ฅ์ด ํต ์ ๋ ฌ๋ณด๋ค ๋๋ฆด ์ ์์ต๋๋ค.
ํฉ๋ณ ์ ๋ ฌ๊ณผ ํต ์ ๋ ฌ์ ๋ ๋ค ํจ์จ์ ์ธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด์ง๋ง, ์๋ ๋ฐฉ์์ ๋ช ๊ฐ์ง ์ค์ํ ์ฐจ์ด์ ์ด ์์ต๋๋ค.
- ์๋ ์๋ฆฌ: ํฉ๋ณ ์ ๋ ฌ์ ๋ฐฐ์ด์ ๋ฐ์ผ๋ก ๋๋๊ณ ๊ฐ ๋ถ๋ถ์ ์ฌ๊ท์ ์ผ๋ก ์ ๋ ฌํ ๋ค์ ํฉ์น๋ ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค. ๋ฐ๋ฉด, ํต ์ ๋ ฌ์ ํผ๋ฒ์ ์ ํํ์ฌ ์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐฐ์ด์ ๋ ๋ถ๋ถ์ผ๋ก ๋๋ ๋ค, ๊ฐ ๋ถ๋ถ์ ์ฌ๊ท์ ์ผ๋ก ์ ๋ ฌํฉ๋๋ค.
- ๊ณต๊ฐ ๋ณต์ก๋: ํฉ๋ณ ์ ๋ ฌ์ ์ถ๊ฐ ๋ฐฐ์ด์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๊ณต๊ฐ ๋ณต์ก๋๊ฐ ๋์ต๋๋ค. ํต ์ ๋ ฌ์ ์ ์๋ฆฌ ์ ๋ ฌ์ด ๊ฐ๋ฅํ์ฌ ์ถ๊ฐ ๊ณต๊ฐ์ด ๊ฑฐ์ ํ์ํ์ง ์์ต๋๋ค.
- ํต ์ ๋ ฌ์ ์ง์ญ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๊ธฐ ๋๋ฌธ์ ์บ์ ํ์ฉ์ด ๋ ํจ์จ์ ์ผ ์ ์์ต๋๋ค. ์ด๋ ํต ์ ๋ ฌ์ ์๋๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ๋์ฌ์ค๋๋ค.
- ๋ฐ๋ฉด ํฉ๋ณ ์ ๋ ฌ์ ๋ถํ ๋ ๋ฐฐ์ด์ ์ฌ๋ฌ ๋ถ๋ถ์ ๋์์ ๋ค๋ฃจ๊ธฐ ๋๋ฌธ์, ์บ์ ํจ์จ์ด ๋จ์ด์ง ์ ์์ต๋๋ค.
- ์ต์ ์ ๊ฒฝ์ฐ ์ฑ๋ฅ: ํฉ๋ณ ์ ๋ ฌ์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง์ง๋ง, ํต ์ ๋ ฌ์ ์ต์ ์ ๊ฒฝ์ฐ ๊น์ง ๋๋ ค์ง ์ ์์ต๋๋ค. (๊ทธ๋ฌ๋ ํต ์ ๋ ฌ์ ์ค์ ์ ์ฉ์์๋ ํผ๋ฒ์ ์ ์ ํํ๊ฑฐ๋, ๋๋คํ ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ ์ต์ ์ ๊ฒฝ์ฐ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค)
- ์์ ์ฑ: ํฉ๋ณ ์ ๋ ฌ์ ์์ ์ ๋ ฌ ๋ฐฉ๋ฒ์ ๋๋ค. ์ฆ, ๋์ผํ ๊ฐ์ ๊ฐ์ง ์์๋ค์ ์์๊ฐ ์ ์ง๋ฉ๋๋ค. ํต ์ ๋ ฌ์ ์์ ์ ์ด์ง ์์ ์ ์์ต๋๋ค.
- ํ๊ท ์ฑ๋ฅ: ํ๊ท ์ ์ผ๋ก, ํต ์ ๋ ฌ์ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์์ ๋ ๋น ๋ฅธ ์ฑ๋ฅ์ ๋ณด์ด๋, ํน์ ๋ฐ์ดํฐ์ ์์๋ ํฉ๋ณ ์ ๋ ฌ์ด ๋ ํจ์จ์ ์ผ ์ ์์ต๋๋ค.
ํ ์ ๋ ฌ์ ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ด ๊ฑฐ์ ์๊ณ , ์ต์ ์ ๊ฒฝ์ฐ์๋ ๊ด์ฐฎ์ ์ฑ๋ฅ์ ๋ณด์ด์ง๋ง, ๋ฐ์ดํฐ์ ์๋์ ์์๋ฅผ ์ ์งํ์ง ์๋ ๋ถ์์ ํ ์ ๋ ฌ ๋ฐฉ์์ด๋ผ๋ ์ ์์ ํ๊ณ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ํ ์ ๋ ฌ์ ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ด ๊ฑฐ์ ์๊ณ , ์ต์ ์ ๊ฒฝ์ฐ์๋ ๊ด์ฐฎ์ ์ฑ๋ฅ์ ๋ณด์ด์ง๋ง, ๋ฐ์ดํฐ์ ์๋์ ์์๋ฅผ ์ ์งํ์ง ์๋ ๋ถ์์ ํ ์ ๋ ฌ ๋ฐฉ์์ด๋ผ๋ ์ ์์ ํ๊ณ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
ํ ์ ๋ ฌ์ด ํต ์ ๋ ฌ์ด๋ ํฉ๋ณ ์ ๋ ฌ์ ๋นํด ์ผ๋ฐ์ ์ผ๋ก ๋ ํจ์จ์ ์ด๋ผ๊ณ ์ฌ๊ฒจ์ง๋ ์ฃผ๋ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์บ์ ํจ์จ์ฑ: ํ ์ ๋ ฌ์ ์ด์ง ํ์ ํน์ฑ์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ํจํด์ด ์ฐ์์ ์ด์ง ์์ ์บ์ ํ์ฉ์ด ๋นํจ์จ์ ์ ๋๋ค. ๋ฐ๋ฉด, ํต ์ ๋ ฌ๊ณผ ํฉ๋ณ ์ ๋ ฌ์ ๋ ์ฐ์์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ํจํด์ ๊ฐ์ง๋ฉฐ, ํนํ ํฉ๋ณ ์ ๋ ฌ์ ์์ฐจ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ผ๋ก ๋์ ์บ์ ํจ์จ์ฑ์ ๋ณด์ ๋๋ค.
- ๋น๊ต ๋ฐ ๊ตํ ํ์: ํ ์ ๋ ฌ์ ํ์ ์ ์งํ๊ธฐ ์ํด ์๋์ ์ผ๋ก ๋ง์ ๋น๊ต์ ์์ ๊ตํ์ ํ์๋ก ํฉ๋๋ค. ํต ์ ๋ ฌ์ ํ๊ท ์ ์ธ ๊ฒฝ์ฐ ๋ ์ ์ ๋น๊ต์ ๊ตํ์ผ๋ก ์ ๋ ฌ์ ์ํํ ์ ์์ผ๋ฉฐ, ํฉ๋ณ ์ ๋ ฌ์ ์ถ๊ฐ์ ์ธ ๊ณต๊ฐ์ ์ฌ์ฉํ์ฌ ํจ์จ์ ์ธ ๋น๊ต์ ๋ณํฉ์ ์ํํฉ๋๋ค.
- ์ต์ ์ ๊ฒฝ์ฐ ์ฑ๋ฅ: ํต ์ ๋ ฌ์ ์ต์ ์ ๊ฒฝ์ฐ O(N^2) ์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง์ง๋ง, ํ๊ท ์ ์ผ๋ก๋ O(NlogN) ์ด๋ฉฐ, ํผ๋ฒ ์ ํ ์ ๋ต์ ๋ฐ๋ผ ์ต์ ์ ๊ฒฝ์ฐ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ํฉ๋ณ ์ ๋ ฌ์ ๋ชจ๋ ๊ฒฝ์ฐ์ O(NlogN) ์ ์ฑ๋ฅ์ ์ ์งํฉ๋๋ค. ํ ์ ๋ ฌ๋ O(NlogN) ์ ์ฑ๋ฅ์ ๋ณด์ด์ง๋ง, ์ค์ ์ฐ์ฐ ํ์๊ฐ ๋ ๋ง์ ์ ์์ต๋๋ค.
- ์์ ์ฑ: ํฉ๋ณ ์ ๋ ฌ์ ์์ ์ ์ธ ์ ๋ ฌ ๋ฐฉ์์ ์ ๊ณตํ๋ ๋ฐ๋ฉด, ํ ์ ๋ ฌ์ ๋ถ์์ ํ ์ ๋ ฌ ๋ฐฉ์์ ๋๋ค. ํต ์ ๋ ฌ ์ญ์ ๋ถ์์ ํ์ง๋ง, ํ๊ท ์ ์ธ ์ฑ๋ฅ์ด ๋ ์ฐ์ํฉ๋๋ค.
- ๊ตฌํ ๋ณต์ก์ฑ: ํ ์ ๋ ฌ์ ์ด์ง ํ ๊ตฌ์กฐ๋ฅผ ์ ์งํด์ผ ํ๋ฏ๋ก ๊ตฌํ์ด ์๋์ ์ผ๋ก ๋ณต์กํฉ๋๋ค. ํต ์ ๋ ฌ์ ๊ตฌํ์ด ๊ฐ๋จํ๊ณ , ํฉ๋ณ ์ ๋ ฌ์ ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํจ์๋ ๋ถ๊ตฌํ๊ณ ๋ณํฉ ๊ณผ์ ์ด ์ง๊ด์ ์ ๋๋ค.
์ถ๊ฐ...
์์ ์ ์ธ ์ ๋ ฌ ๋ฐฉ๋ฒ(Stable Sorting Algorithm)์ด๋ ๋์ผํ ๊ฐ์ ๊ฐ์ง ์์๋ค์ ์๋์ ์ธ ์์๊ฐ ์ ๋ ฌ ๊ณผ์ ์์ ๋ณ๊ฒฝ๋์ง ์๋ ์ ๋ ฌ ๋ฐฉ๋ฒ์ ์๋ฏธํฉ๋๋ค. ์ฆ, ์ ๋ ฌ ์ ํ๋ก ๊ฐ์ ๊ฐ์ ์์๋ค ์ฌ์ด์ ์์๊ฐ ๋ณด์กด๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ ๊ฐ์ฒด๋ค์ ๋ฆฌ์คํธ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ด
์๋ค.
[('apple', 2), ('orange', 1), ('banana', 2)]
์ฌ๊ธฐ์ ์ซ์๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ ์ ์ธ ์ ๋ ฌ์ ์ํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ฉ๋๋ค.
[('orange', 1), ('apple', 2), ('banana', 2)]
apple๊ณผ banana๋ ๊ฐ์ ๊ฐ์ ๊ฐ์ง์ง๋ง, ์ ๋ ฌ ์ apple์ด banana๋ณด๋ค ๋จผ์ ๋์๊ธฐ ๋๋ฌธ์ ์ ๋ ฌ ํ์๋ ๊ทธ ์์๊ฐ ์ ์ง๋ฉ๋๋ค.
์์ ์ ์ธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์๋ก๋ ๋ฒ๋ธ ์ ๋ ฌ(Bubble Sort), ๋ณํฉ ์ ๋ ฌ(Merge Sort), ์ฝ์
์ ๋ ฌ(Insertion Sort) ๋ฑ์ด ์์ต๋๋ค. ๋ฐ๋ฉด, ์ ํ ์ ๋ ฌ(Selection Sort)๊ณผ ํต ์ ๋ ฌ(Quick Sort)๊ณผ ํ ์ ๋ ฌ(Heap Sort) ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ ์์ ์ ์ด์ง ์์ต๋๋ค. ์ด๋ฌํ ๊ตฌ๋ณ์ ํนํ ๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ค๋ฃฐ ๋ ์ค์ํ ์ ์์ผ๋ฉฐ, ๋ฐ์ดํฐ์ ์์๊ฐ ์ค์ํ ์ํฉ์์๋ ์์ ์ ์ธ ์ ๋ ฌ ๋ฐฉ๋ฒ์ ์ ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๐ฃ๏ธ ๋ฒ๋ธ ์ ๋ ฌ ์๊ฐ ๋ณต์ก๋: O(N^2), ๋ฉ๋ชจ๋ฆฌ: O(1)
๐์๊ฐ
๋ฒ๋ธ ์ ๋ ฌ์ ์ธ์ ํ ๋ ์๋ฅผ ๊ณ์ํด์ ๋น๊ตํ์ฌ ์ ๋ ฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
1. ์ธ์ ํ ๋ ์๋ฅผ ๋์๋ฅผ ๋น๊ตํ๋ค.
2. ๋ด๋ฆผ์ฐจ์, ์ค๋ฆ์ฐจ์์ ๋ฐ๋ผ ๋ ์์ ์๋ฆฌ๋ฅผ ๋ฐ๊พผ๋ค.
3. ๋๋จธ์ง ๊ฐ๋ค๋ ๋์ผํ๊ฒ ์ฒ๋ฆฌํ๋ค.
๊ตฌํ์ด ๋งค์ฐ ๊ฐ๋จํ์ฌ ์ฝ๋ ๊ตฌํ์ด ์ฝ์ง๋ง, ๋น๊ต ์์ ์ด ๋ง๊ธฐ ๋๋ฌธ์ ์๊ฐ ๋ณต์ก๋๊ฐ O(n^2) ๋ก ์ค๋ ๊ฑธ๋ฆฐ๋ค๋ ๋จ์ ์ด ์๋ค.
์ ์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํ ๋๋ ๋ฒ๋ธ ์ ๋ ฌ์ ์ธ ์ ์์ง๋ง, ๋์ฉ๋์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌ์ ์์ฒญ ์๊ฐ์ด ์์๋ ๊ฒ์ด๋ค.
์ถ์ฒ https://meongj-devlog.tistory.com/193
๐์ฝ๋
#include <vector>
#include <algorithm>
using namespace std;
void bubble_sort(vector<int>& v)
{
const int n = v.size();
for (int i = 0; i < n - 1; i++)
{
for (int j = 0; j < n - 1 - i; j++)
{
if (v[j] > v[j + 1]) swap(v[j], v[j + 1]);
}
}
}
๐ฃ๏ธ ์ฝ์ ์ ๋ ฌ ์ต์ ์ ์๊ฐ: O(n), ์ต์ ์ ์๊ฐ: O(n^2), ๊ณต๊ฐ ๋ณต์ก๋: O(1)
๐์๊ฐ
์ฝ์
์ ๋ ฌ์ ์๋ฃ ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ฅผ ์์์๋ถํฐ ์ฐจ๋ก๋๋ก ์ด๋ฏธ ์ ๋ ฌ๋ ๋ฐฐ์ด ๋ถ๋ถ๊ณผ ๋น๊ตํ์ฌ
์์ ์ ์์น๋ฅผ ์ฐพ์ ์ฝ์
ํจ์ผ๋ก์จ ์ ๋ ฌ์ ์์ฑํ๋ ์๊ณ ๋ฆฌ์ฆ์
๋๋ค.
+ ์ ์์ ์นด๋๋ฅผ ์ ๋ ฌํ๋ ๋ฐฉ๋ฒ๊ณผ ๊ฐ์ต๋๋ค.
์๋ก์ด ์นด๋๋ฅผ ์ ๋ ฌ๋ ์นด๋ ์ฌ์ด์ ์๋ง์ ์ฌ์ด๋ฅผ ์ฐพ์ ์ฝ์
ํด์ค๋๋ค.
๋๋ฒ์งธ ์์๋ถํฐ ์์ํ์ฌ ๊ทธ ์ ์์๋ค๊ณผ ๋น๊ตํ์ฌ ์ฝ์
ํ ์์น๋ฅผ ์ง์ ํ๊ณ ์์๋ฅผ ๋ค๋ก ์ฎ๊ธฐ๊ณ
๊ทธ ์๋ฆฌ์ ์์๋ฅผ ์ฝ์
ํ์ฌ ์ ๋ ฌํฉ๋๋ค.
๐์๊ฐ ๋ณต์ก๋
์ต์ ์ผ ๊ฒฝ์ฐ (์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋์ด ์์)
- ์ด๋์์ด 1๋ฒ์ฉ ๋น๊ตํ ๊ฒฝ์ฐ
- ๋น๊ต ํ์: n - 1 ๋ฒ O(n)
์ต์ ์ผ ๊ฒฝ์ฐ (๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ๋์ด ์์)
- ๋น๊ต ํ์: ์ธ๋ถ ๋ฃจํ ์์ ๊ฐ ๋ฐ๋ณต๋ง๋ค n - 1, n - 2, ... , 1 ๋ฒ์ ๋ฐ๋ณต
- (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)
๐์ฝ๋
#include <vector>
#include <iostream>
using namespace std;
void insertion_sort(vector<int>& v)
{
const int n = v.size();
for (int i = 1; i < n; i++)
{
int key = v[i];
int j = i - 1;
while (j >= 0 && v[j] > key)
{
v[j + 1] = v[j];
j = j - 1;
}
v[j + 1] = key;
}
}
๐ ์ถ์ฒ
https://meongj-devlog.tistory.com/194 ๐์๊ฐ ๋ณต์ก๋
https://blackon29.tistory.com/4 ๐ ์ฝ๋
๋ฒ๋ธ, ์ฝ์ , ์ ํ ์๊ณ ๋ฆฌ์ฆ์ ๋ชจ๋ ๊ธฐ๋ณธ์ ์ธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก, ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์ ๋ํด์๋ ๋นํจ์จ์ ์ผ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ฐ๋จํ ์ฌ์ฉ ์ฌ๋ก๋ ์์ ๋ฐ์ดํฐ์ ์๋ ์ฌ์ ํ ์ ์ฉํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ๊ฐ ์ด๋ฏธ ๋ถ๋ถ์ ์ผ๋ก ์ ๋ ฌ๋์ด ์๊ฑฐ๋, ๋ฐ์ดํฐ์ ์์ด ์ ์ ๋๋ ์ฝ์ ์ ๋ ฌ์ด ๋ค๋ฅธ ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋นํด ๋ ๋น ๋ฅผ ์ ์์ต๋๋ค.
๐ฃ๏ธ ์ ํ ์ ๋ ฌ ์๊ฐ ๋ณต์ก๋: O(n^2), ๊ณต๊ฐ ๋ณต์ก๋: O(1)
๐์๊ฐ
์ ํ ์ ๋ ฌ์ ์ ์๋ฆฌ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ํ๋๋ก ์ ๋ ฌ๋์ง ์์ ๋ฐ์ดํฐ๋ค ์ค์์ ๊ฐ์ฅ ์์ ๊ฐ์ ์ถ์ถํ์ฌ ๊ฐ์ฅ ๋งจ ์์ผ๋ก ์ ๋ ฌํด๋๊ฐ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
1. ๋ฐฐ์ด ์ค์ ์ต์๊ฐ์ ์ฐพ๋๋ค.
2. ์ต์๊ฐ์ ๋งจ ์์ผ๋ก ์ ๋ ฌ์ํจ๋ค.(swap)
3. ๋๋จธ์ง ๊ฐ๋ค๋ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ ๋ ฌํด๋๊ฐ๋ค.
์๊ณ ๋ฆฌ์ฆ์ด ๋จ์ํ๊ณ ์ฌ์ฉํ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ํ์ ์ธ ๊ฒฝ์ฐ ์ฌ์ฉํ๊ธฐ์ ์ฉ์ดํ๋ฉฐ,
๊ตฌํ์ด ๊ฐ๋จํ์ง๋ง ๋นํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ธ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๐์๊ฐ ๋ณต์ก๋
๊ธฐ์ค๊ฐ๊ณผ ๋น๊ต๊ฐ๋ค ์ค ์ต์๊ฐ์ ์ฐพ๊ธฐ ์ํด ์ด์ค for๋ฌธ ํ์
- ์ฒซ ๋ฒ์งธ ํ์ ๋น๊ต ํ์ : 1 ๋ถํฐ (n-1) = n-1
- ๋ ๋ฒ์งธ ํ์ ๋น๊ต ํ์ : 2 ๋ถํฐ (n-1) = n-2
...
=> ์ต์๊ฐ ์ฐพ๊ธฐ : n-1, n-2, ..., 2, 1 ๋ฒ
T(n) = (n-1)+(n-2)+...+2+1=n(n-1)/2 = O(n^2)
๐ ์ถ์ฒ
https://meongj-devlog.tistory.com/194
๐์ฝ๋
void selection_sort(vector<int>& v)
{
const int n = v.size();
for (int i = 0; i < n - 1; i++)
{
int minIdx = i;
for (int j = i + 1; j < n; j++)
{
// minIdx ๋ณด๋ค ์์ ์์๊ฐ ์๋ค๋ฉด ๊ต์ฒด ํ ๊ฐฑ์
if (v[j] < v[minIdx])
minIdx = j;
}
if (i != minIdx)
swap(v[i], v[minIdx]);
}
}
๐ฃ๏ธ ํต ์ ๋ ฌ ํ๊ท ๊ณผ ์ต์ ์ ์๊ฐ: O(NlogN), ์ต์
์ ์๊ฐ O(N^2) ... ํต์ด๋ผ๋ฉฐ.
ํต ์ ๋ ฌ์ ๋ฌด์์๋ก ์ ์ ๋ ํ ์์(Pivot ์ญํ ) ์ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด์ ๋ถํ ํ๋ค.
์ ์ ๋ ์์๋ณด๋ค ์์ ์์๋ค์ ์์, ํฐ ์์๋ค์ ๋ค์ ๋ณด๋ธ๋ค. โก ๊ทธ๋ฆฌ๊ณ ๋ฐฐ์ด์ด ๋ถํ ๋๋ค.
๋ฐฐ์ด ๋ถํ ์์
์ ์์๊ฐ์ด ์ฐ์๋ swap ์ฐ์ฐ์ ํตํด ํจ์จ์ ์ผ๋ก ์ํ๋๋ค.
๋ฐฐ์ด๊ณผ ๊ทธ ๋ถ๋ถ ๋ฐฐ์ด์ ๋ฐ๋ณต์ ์ผ๋ก ๋ถํ ํด ๋๊ฐ๋ฉด ๊ฒฐ๊ตญ์ ๋ฐฐ์ด์ ์ ๋ ฌ๋ ์ํ์ ๋๋ฌํ๋ค.
ํ๋์ ๋ถํ ๊ณผ์ ์์ ์ฌ์ฉ๋๋ ์์(Pivot) ์ด ์ค๊ฐ๊ฐ, ์ ์ด๋ ์ค๊ฐ๊ฐ์ ๊ฐ๊น์ด ๊ฐ์ด ๋๋ฆฌ๋ผ๋ ๋ณด์ฅ์ด ์๊ธฐ์ ํต ์ ๋ ฌ์ ์ต์ ์ ๊ฒฝ์ฐ ์ํ ์๊ฐ์ด O(N ^2)์ด ๋ ์ ์๋ค.
ํ๊ท ์ ์ผ๋ก๋ O(NLogN)์ด๋ค.
ํ๋์ ๋ฆฌ์คํธ๋ฅผ Pivot ์ ๊ธฐ์ค์ผ๋ก ๋ ๊ฐ์ ๋ถ๋ถ๋ฆฌ์คํธ๋ก ๋๋์ด ํ๋๋ Pivot ๋ณด๋ค ์์ ๊ฐ๋ค์ ๋ถ๋ถ๋ฆฌ์คํธ, ๋ค๋ฅธ ํ๋๋ Pivot ๋ณด๋ค ํฐ ๊ฐ๋ค์ ๋ถ๋ถ๋ฆฌ์คํธ๋ก ์ ๋ ฌํ ๋ค์, ๊ฐ ๋ถ๋ถ๋ฆฌ์คํธ์ ๋ํด ๋ค์ ์ ์ฒ๋ผ ์ฌ๊ท์ ์ผ๋ก ์ํํ์ฌ ์ ๋ ฌํ๋ ๋ฐฉ๋ฒ์ด๋ค.
ํฉ๋ณ์ ๋ ฌ๊ณผ ๋ค๋ฅธ์ ์ ํฉ๋ณ์ ๋ ฌ์ ๊ฒฝ์ฐ ์ ๋ฐ์ผ๋ก ๋๋์ด ๋ถํ ์ ๋ณตํ๊ณ , ํต์ ๋ ฌ์ Pivot ์ ๊ธฐ์ค์ผ๋ก ๋๋๊ธฐ ๋๋ฌธ์ ๋น๊ท ๋ฑํ๊ฒ ๋๋์ด ์ ๋ณตํ๋ค๋ ์ ์ด๋ค.
์๋ก ๋จ์ด์ง ์์๋ผ๋ฆฌ ๊ตํ์ด ์ผ์ด๋๊ธฐ ๋๋ฌธ์ ๋ถ์์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
Pivot ์ ์ ํํ๋ ๊ธฐ์ค์ 3๊ฐ์ง์ด๋ค. ์ผ์ชฝ, ์ค์, ์ค๋ฅธ์ชฝ
์ ํํจ์ ๋ฐ๋ผ ์ฝ๋๊ฐ ์ฝ๊ฐ ๋ฌ๋ผ์ง ์ ์์ง๋ง ๋ชจ๋ ' Pivot '์ ์ค์ ํ๊ณ Pivot ์ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ ์ค๋ฅธ์ชฝ ๋ถ๋ถ๋ฆฌ์คํธ๋ฅผ ๋ง๋๋ ๊ณผ์ ์ ๊ฐ๋ค. ์ด๋ฅผ Partitioning ๊ณผ์ ์ด๋ผ๊ณ ํ๋ค.
Pivot ์ ์ผ์ชฝ์ผ๋ก ์ ํํ๋๊ฒ์ด ์ดํดํ๊ธฐ ์ฝ๊ธฐ ๋๋ฌธ์ ์ผ์ชฝ ์ ํ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๊ฒ ๋ค.
- Pivot ์ ํ๋ ์ ํํ๋ค (์ผ์ชฝ, ์ค์, ์ค๋ฅธ์ชฝ ์์ ๋กญ๊ฒ)
- Pivot ์ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ์์๋ Pivot ๋ณด๋ค ํฐ ๊ฐ์ ์ฐพ๊ณ , ์ค๋ฅธ์ชฝ์์๋ Pivot ๋ณด๋ค ์์ ๊ฐ์ ์ฐพ๋๋ค.
- ์ ๋ฐฉํฅ์์ ์ฐพ์๋ค๋ฉด ๋ ์์๋ฅผ ๊ตํํ๋ค.
- ์ผ์ชฝ ํ์ ์์น๊ฐ ์ค๋ฅธ์ชฝ ํ์์์น ๋ณด๋ค ์๋ค๋ฉด ๋ค์ 2๋ฒ๋ถํฐ ๋ฐ๋ณตํ๋ค. ๋์ ์์น๊ฐ ์๊ฐ๋ ธ๋ค๋ฉด 5๋ฒ์ผ๋ก
- ์๊ฐ๋ฆฐ ๊ธฐ์ ์ ๊ธฐ์ค์ผ๋ก ๋ ๊ฐ์ ๋ถ๋ถ๋ฆฌ์คํธ๋ก ๋๋์ด 1๋ฒ์ผ๋ก ๋์๊ฐ ํด๋น ๋ถ๋ถ๋ฆฌ์คํธ์ ๊ธธ์ด๊ฐ 1์ด ์๋ ๋ ๊น์ง 1๋ฒ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค (๋ถํ )
- ๊ฒฐ๊ตญ ๋ฑ๊ฐ๋ก ๋๋๊ฒ ๋์ด์๊ณ ๋ค ๋ถํ ํ๋ฉด ์ธ์ ํ ๋ถ๋ถ๋ฆฌ์คํธ๋ผ๋ฆฌ ํฉ์น๋ค (์ ๋ณต)
#include <iostream>
using namespace std;
//ํต์ ๋ ฌ
int n,cnt, quick[10000001];
void quickSort(int i, int j)
{
if(i>=j) return;
int pivot = quick[(i+j)/2];
int left = i;
int right = j;
while(left<=right)
{
while(quick[left]<pivot) left++;
while(quick[right]>pivot) right--;
if(left<=right)
{
swap(quick[left],quick[right]);
left++; right--;
}
}
quickSort(i,right);
quickSort(left,j);
}
๐ฃ๏ธ ํ ์ ๋ ฌ ์๊ฐ ๋ณต์ก๋: O(NLogN)
๋จผ์ ํ ์ ๋ ฌ์ ์์ ์ด์งํธ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํ๋๋ ์ ๋ ฌ ๋ฐฉ์์ด๋ค. ์์ ์ด์งํธ๋ฆฌ๋ ํธ๋ฆฌ์ ๋ง์ง๋ง ๋ ๋ฒจ์ ์ ์ธํ ๋๋จธ์ง ๋ ๋ฒจ์ ๋ชจ๋ Node๊ฐ ์ฑ์์ ธ ์์ผ๋ฉฐ, ๋ง์ง๋ง ๋ ๋ฒจ์ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ ธ๋๊ฐ ์ฑ์์ง Tree๋ฅผ ๋งํ๋ค.
๋ง ๊ทธ๋๋ ์ต๋ํ์ root๋ ์ ์ผ ํฐ ๊ฐ์ ๊ฐ์ง๊ธฐ ๋๋ฌธ์, ์ต๋๊ฐ์ ์ฐพ๋๋ฐ ์์๋๋ ์๊ฐ์ `O(1)`์ด๋ค. ๋ฃจํธ ๋ ธ๋์์ ์ต๋๊ฐ์ ์ญ์ ํ๋ฉด ๋น ๋ฃจํธ๋ ธ๋๋ฅผ ๋ค๋ฅธ ๋ ธ๋๊ฐ ์ฑ์์ค์ผํ๋ค. ์ด ๊ณผ์ ์์ heap์ ๋งจ ๋ง์ง๋ง ๋ ธ๋๋ฅผ ๋ฃจํธ ๋ ธ๋๋ก ๋์ฒดํ ํ, heapify ๊ณผ์ ์ ๊ฑฐ์ณ heap ๊ตฌ์กฐ๋ฅผ ์ ์งํ๋ค.
ํ์ ๊ฒฝ์ฐ๋ ์์ ์ ๋ ฌ ์ํ๊ฐ ์๋๊ณ ๋์จํ ์ ๋ ฌ ์ํ์ด๋ค. ์๋๋ฉด ๋ชจ๋ ๋ ธ๋๊ฐ ์ ๋ ฌ๋์ฑ ์ ์ง๋๋๊ฒ์ด ์๋ ๋ถ๋ชจ ๋ ธ๋๊ฐ ์์๋ ธ๋๋ณด๋ค ํญ์ ํฐ๊ฐ์ด๋ผ๋ ์กฐ๊ฑด๋ง ๋ง์กฑํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ง๊ทธ๋๋ก, ํ์ ๊ฐ์ ์ฐ์ ์์๋ ๊ณ ๋ คํ์ง ์๋๋ค
C++์ ๊ฒฝ์ฐ ํ์ค ์ฐ์ ์์ํ (๋ด๋ฆผ์ฐจ์) ๊ฐ ํ์๋ฃ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํ๋์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ C++ ์์ ํ์ ๋ ฌ์ ์ด์ฉํ๊ณ ์ ํ๋ฉด `priority_queue`๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค. ์๋ ์ฝ๋๋ฅผ ํ์ธํ๋ฉด ์ด๋ค ์ํฉ์์๋ O(NlogN)์ด๋ค.
#include <vector>
#include <queue>
#include <algorithm>
void HeapSort(vector<int>& v)
// ์
๋ ฅ์ผ๋ก ๋ฐ์ ๋ฒกํฐ v๋ฅผ ํ ์ ๋ ฌํ์ฌ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ค.
{
priority_queue<int, vector<int>, greater<int>> pq;
// ์ฐ์ ์์ ํ ์์ฑ.
// priority_queue ์ ์ธ ๋ฒ์งธ ํ
ํ๋ฆฟ ์ธ์๋ก greater<int> ๋ฅผ ์ฌ์ฉํ์ฌ
// ์์ ๊ฐ๋ถํฐ ํฐ ๊ฐ๊น์ง ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋๋๋ก ์ค์ .
// greater<int> ๋ C++ STL์ ํจ์ ๊ฐ์ฒด (predicate) ์ด๋ค.
// O(NlogN)
for (int num : v)
pq.push(num); // ์
๋ ฅ๊ฐ๋ค์ pq์ ๋ฃ์ด์ฃผ๊ณ // O(logN)
v.clear(); // ๋ฒกํฐ๋ฅผ ๋น์์ค๋ค.
// O(NlogN)
while (pq.empty() == false) // ์ฐ์ ์์ ํ๊ฐ ๋น์ด์์ง ์์ ๋์
{
v.push_back(pq.top()); // O(1) // ๊ฐ์ฅ ์์ ๊ฐ์ ๋ฒกํฐ์ ์ถ๊ฐํ๋ค.
pq.pop(); // O(logN) // ๊ฐ์ฅ ์์ ๊ฐ์ ์ฐ์ ์์ ํ์์ ์ ๊ฑฐํ๋ค.
}
}
์์ ๊ฐ์ด ์ ๋ ฌํ๋ค๋ฉด ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ pq๊ฐ ํ์ํ๋ค.
๋ง์ฝ heap์ ์ง์ ๊ตฌํํ์ฌ ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์์ด ํ์ ๋ ฌ์ ๊ตฌํํ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
ํ์ ๋ ฌ์ ์์ ์ด์งํธ๋ฆฌ ๊ธฐ๋ฐ์ผ๋ก์จ, ๋ฐฐ์ด์ ์์ ์ด์งํธ๋ฆฌ ๊ผด๋ก ์๊ฐํ๊ณ ๊ณ์ฐ์ ํ ์ ์๋ค.
์ค์ ๋ก Left_Child, Right_Child, Parent_Node ๋ฑ์ ํน๋ณํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํด์ ์์ฑํ๋ ๊ฒ์ ์๋๊ณ ,
Index๋ฒํธ๋ฅผ ๋ง์น ์์ ์ด์งํธ๋ฆฌ ์ฒ๋ผ ์๊ฐํ๊ณ ์ฌ์ฉํ๋ค.
heap์ ์๋ฃ๊ตฌ์กฐ๋ ์ด๋ป๊ฒ ๊ตฌํํ ์ ์์๊น? ๋ฐ๋ก ๋ฐฐ์ด์ ์ด์ฉํ๋๊ฒ์ด๋ค. ํ์ ์ด๋ฌํ ๊ท์น์ ๊ฐ์ง๋ค.
์ผ์ชฝ ์์ ๋ ธ๋ ์ธ๋ฑ์ค = ๋ถ๋ชจ ๋ ธ๋ ์ธ๋ฑ์ค x 2 + 1
์ค๋ฅธ์ชฝ ์์ ๋ ธ๋ ์ธ๋ฑ์ค = ๋ถ๋ชจ ๋ ธ๋ ์ธ๋ฑ์ค x 2 + 2
๋ถ๋ชจ ๋ ธ๋ ์ธ๋ฑ์ค = (์์๋ ธ๋ ์ธ๋ฑ์ค - 1) / 2
ํ ์ ๋ ฌ์ ํต์ฌ ๋จ๊ณ๋ ๋ ๋ถ๋ถ์ผ๋ก ๋๋ฉ๋๋ค.
- Heapify: ์ฃผ์ด์ง ๋ฐฐ์ด์ ํ์ผ๋ก ๋ณํํฉ๋๋ค. ์ด ๊ณผ์ ์์๋ ๋ฐฐ์ด์ ๋น๋ฆฌํ ๋ ธ๋ (leaf node๊ฐ ์๋ ๋ ธ๋) ์์ ์์ํ์ฌ ๋ฃจํธ ๋ ธ๋๊น์ง ๊ฑฐ๊พธ๋ก ์ด๋ํ๋ฉด์ ํ ์์ฑ์ ๋ง์กฑํ๋๋ก ์กฐ์ ํฉ๋๋ค.
- Sort: ํ์์ ์ต๋๊ฐ(๋๋ ์ต์๊ฐ)์ ์ถ์ถํ๊ณ , ๋จ์ ์์๋ค๋ก ํ์ ์ฌ๊ตฌ์ฑํ ํ, ๋ฐฐ์ด์ ๋์์๋ถํฐ ์ ๋ ฌ๋ ์์๋ฅผ ๋ฐฐ์นํฉ๋๋ค.
์๋ ์ฝ๋์์ heapify ํจ์๋ ์ฃผ์ด์ง ๋ ธ๋๋ฅผ ๋ฃจํธ๋ก ํ๋ ์๋ธํธ๋ฆฌ๊ฐ ํ ์์ฑ์ ๋ง์กฑํ๋๋ก ์กฐ์ ํฉ๋๋ค.
heap_sort ํจ์๋ ๋จผ์ ๋ฐฐ์ด์ ํ์ผ๋ก ๋ณํํ๊ณ , ๊ฐ ์์๋ฅผ ์ถ์ถํ์ฌ ์ ๋ ฌ๋ ๋ฐฐ์ด์ ๋ง๋ญ๋๋ค.
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
// Heapify ๊ณผ์ ์ ์ํํ๋ ํจ์
void heapify(vector<int>& v, int n, int i) {
int largest = i; // ๊ฐ์ฅ ํฐ ์์๋ฅผ ๊ฐ๋ฆฌํค๋ ์ธ๋ฑ์ค๋ก i(๋ฃจํธ)๋ฅผ ์ด๊ธฐํ
int left = 2 * i + 1; // ์ผ์ชฝ ์์ ๋
ธ๋ ์ธ๋ฑ์ค
int right = 2 * i + 2; // ์ค๋ฅธ์ชฝ ์์ ๋
ธ๋ ์ธ๋ฑ์ค
// ์ผ์ชฝ ์์์ด ๋ฃจํธ๋ณด๋ค ํฐ ๊ฒฝ์ฐ
if (left < n && v[left] > v[largest])
largest = left;
// ์ค๋ฅธ์ชฝ ์์์ด ํ์ฌ ๊ฐ์ฅ ํฐ ์์๋ณด๋ค ํฐ ๊ฒฝ์ฐ
if (right < n && v[right] > v[largest])
largest = right;
// ๊ฐ์ฅ ํฐ ์์๊ฐ ๋ฃจํธ๊ฐ ์๋ ๊ฒฝ์ฐ
if (largest != i) {
swap(v[i], v[largest]);
// ์ฌ๊ท์ ์ผ๋ก ํ์ ํธ๋ฆฌ์ ๋ํด heapify๋ฅผ ํธ์ถ
heapify(v, n, largest);
}
}
// ํ ์ ๋ ฌ์ ์ํํ๋ ํจ์
void heap_sort(vector<int>& v) {
int n = v.size();
// ๋ฐฐ์ด์ ํ์ผ๋ก ๊ตฌ์ฑ
for (int i = n / 2 - 1; i >= 0; i--)
heapify(v, n, i);
// ํ๋์ฉ ์์๋ฅผ ์ถ์ถํ๋ฉด์ ํ์ ์ฌ๊ตฌ์ฑ
for (int i = n - 1; i > 0; i--) {
swap(v[0], v[i]); // ํ์ฌ ๋ฃจํธ(๊ฐ์ฅ ํฐ ๊ฐ)๋ฅผ ๋์ผ๋ก ์ด๋
heapify(v, i, 0); // ํ์ ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ ์ฌ๊ตฌ์ฑ
}
}
int main() {
vector<int> data = {12, 11, 13, 5, 6, 7};
heap_sort(data);
cout << "Sorted array: \n";
for (int i : data)
cout << i << " ";
cout << endl;
return 0;
}
๐ฃ๏ธ ๋ณํฉ ์ ๋ ฌ ์๊ฐ ๋ณต์ก๋: O(NLogN), ๊ณต๊ฐ ๋ณต์ก๋: ๋ฉ๋ชจ๋ฆฌ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฆ
๋ณํฉ์ ๋ ฌ ๋๋ ํฉ๋ณ์ ๋ ฌ์ ์ ๋ ฌํ ๋ฐ์ดํฐ๋ค์ ์ผ๋จ ๋ฐ์ผ๋ก ์ชผ๊ฐ๊ณ ๊ฐ ๊ฐ ์ ๋ ฌํ ํ ๋์ค์ ํฉ์น๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๋น๊ต ๊ธฐ๋ฐ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๊ณ , ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํํ์ ๋ ์์ ์ ๋ ฌ์ ์ํ๋ฉฐ ๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ์ ํ๋์ด๋ค.
๋งค๋ฒ ์ ๋ ฌ๋ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ๋ฐฐ์ด ๊ณต๊ฐ์ด ์ถ๊ฐ์ ์ผ๋ก ํ์ํ๋ค๋ ์ ์์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ด ๋นํจ์จ์ ์ธ ๋ฌธ์ ๊ฐ ์๋ค. ์ด์ ๋ณํฉ ์ ๋ ฌ์ ์๊ฐ ๋ณต์ก๋๋ ์ด๋ค ์ํฉ์์๋ O(NlogN)์ด๋ค.
์ถ์ฒ: https://meongj-devlog.tistory.com/197
ํฉ๋ณ = '๋ฌธ์ ๋ฅผ ๋ถํ ํ๊ณ , ๋ถํ ํ ๋ฌธ์ ๋ฅผ ์ ๋ณตํ์ฌ ํฉ์น๋ ๊ณผ์ '์ด๋ค.
1. ์ฃผ์ด์ง ๋ฆฌ์คํธ๋ฅผ ์ ๋ฐ์ผ๋ก ๋ถํ ํ์ฌ ๋ถ๋ถ๋ฆฌ์คํธ๋ก ๋๋๋ค. (๋ถํ )
2. ํด๋น ๋ถ๋ถ๋ฆฌ์คํธ์ ๊ธธ์ด๊ฐ 1์ด ์๋๋ผ๋ฉด 1๋ฒ ๊ณผ์ ์ ๋ํ์ดํ๋ค.
3. ์ธ์ ํ ๋ถ๋ถ๋ฆฌ์คํธ๋ผ๋ฆฌ ์ ๋ ฌํ์ฌ ํฉ์น๋ค. (์ ๋ณต)
#include <vector>
#include <queue>
#include <algorithm>
/*
[3][K][7][2][J][4][8][9]
[3][K][7][2] [J][4][8][9]
[3][K] [7][2] [J][4] [8][9]
[3] [K] [7] [2] [J] [4] [8] [9]
[3][K] [7][2] [J][4] [8][9]
[3][K][7][2] [J][4][8][9]
*/
void MergeResult(vector<int>& v, int left, int mid, int right)
{
int leftIdx = left;
int rightIdx = mid + 1;
// ์์ ๋ฒกํฐ
vector<int> temp;
// O(N)
while (leftIdx <= mid && rightIdx <= right)
// ๋ฐ์ดํฐ๊ฐ ์์ง ๋จ์์๋ค๋ฉด
{
if (v[leftIdx] <= v[rightIdx])
{
temp.push_back(v[leftIdx]);
leftIdx++; // ์ปค์ ์ฎ๊ฒจ์ฃผ๊ธฐ
}
else
{
temp.push_back(v[rightIdx]);
rightIdx++; // ์ปค์ ์ฎ๊ฒจ์ฃผ๊ธฐ
}
}
// ์ผ์ชฝ์ด ๋จผ์ ๋๋ฌ๋ค๋ฉด (์ผ์ชฝ ๋ถ๋ถ ๋ฐฐ์ด ๋ณํฉ์ด ๋ชจ๋ ๋๋๋ฉด)
if (leftIdx > mid)
{
while (rightIdx <= right)
{
temp.push_back(v[rightIdx]);
rightIdx++;
}
}
// ์ค๋ฅธ์ชฝ์ด ๋จผ์ ๋๋ฌ๋ค๋ฉด (์ค๋ฅธ์ชฝ ๋ถ๋ถ ๋ฐฐ์ด์ด ๋ชจ๋ ๋ณํฉ๋์ด ๋๋ฌ๋ค๋ฉด)
else
{
while (leftIdx <= mid)
{
temp.push_back(v[leftIdx]);
leftIdx++;
}
}
// temp ์ ๋ฃ์ด์ค ๊ฑธ ์๋ณธ์ ๋ฎ์ด์ฐ๊ธฐ
for (int i = 0; i < temp.size(); i++)
v[left + i] = temp[i];
}
// O(NlogN)
void MergeSort(vector<int>& v, int left, int right)
// ์์ญ์ ์ฐ์ด์ ๊ด๋ฆฌํ๋ ์์ผ๋ก ํด๋ณด๊ธฐ!
{
if (left >= right)
return;
// ๋ถํ
int mid = (left + right) / 2;
// ์ฌ๊ท
MergeSort(v, left, mid);
MergeSort(v, mid + 1, right);
// ๋๋ ๊ฑธ ๋ค์ ํฉ์น๊ธฐ ์ํด ์๋ ํจ์๋ฅผ ํธ์ถ
MergeResult(v, left, mid, right);
}
int main()
{
vector<int> v{ 1, 5, 3, 4, 2 };
MergeSort(v, 0, v.size() - 1);
}
์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ๋ค์ ๋ํด ์ค๋ช ํ๋ผ.
์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์์ ๊ต์ฅํ ๋ง์ง๋ง ํฌ๊ฒ ๋ค์ฏ ๊ฐ์ง๋ง ์ถ๋ฆฌ์๋ฉด
๋ฒ๋ธ์ ๋ ฌ, ์ ํ์ ๋ ฌ, ์ฝ์ ์ ๋ ฌ, ํฉ๋ณ์ ๋ ฌ, ํต์ ๋ ฌ์ด ์์ต๋๋ค.
๋ฒ๋ธ์ ๋ ฌ : ์๋ก ์ธ์ ํ ๋ ์์๋ฅผ ๊ฒ์ฌํ์ฌ ์ ๋ ฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก์ ์ด์คfor๋ฌธ์ ์ฌ์ฉํ์ฌ ๊ณ์ํด์ ๋ค์์ธ๋ฑ์ค๋ ๋น๊ตํ ๋ฐ๊พธ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
์ ํ์ ๋ ฌ : ์ ์๋ฆฌ ์ ๋ ฌ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋๋ก์, ํด๋น ์์์ ๋ฃ์ ์์น๋ ์ ํด๋๊ณ ์ด๋ค ์์๋ฅผ ๋ฃ์์ง ์ ํํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. ์ฒซ๋ฒ์งธ ์๋ฃ๋ฅผ ๋๋ฒ์งธ ์๋ฃ๋ถํฐ ๋๊น์ง ๋น๊ต ํ ๊ฐ์ฅ์์ ๊ฐ์ ์ฐพ์๋ฃ๊ณ ๋๋ฒ์จฐ ์๋ฃ๋ ์ธ๋ฒ์งธ์๋ฃ๋ถํฐ ๋ง์ง๋ง๊น์ง ๋น๊ตํ์ฌ ๋ฃ๋ ๋ฐฉ์์ ๋ฐ๋ณตํ์ฌ ์ ๋ ฌํฉ๋๋ค.
์ฝ์ ์ ๋ ฌ : ์๋ฃ ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ฅผ ์์์๋ถํฐ ์ฐจ๋๋๋ก ์ด๋ฏธ ์ ๋ ฌ๋ ๋ฐฐ์ด ๋ถ๋ถ๊ณผ ๋น๊ตํ์ฌ, ์์ ์ ์์น๋ฅผ ์ฐพ์ ์ฝ์ ํจ์ผ๋ก์ ์ ๋ ฌ์ ์์ฑํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. ๋๋ฒ์งธ ์๋ฃ๋ถํฐ ์์ํ์ฌ n - 1 ์ ๋ฐ๋ณตํ๋ฉด์ ์์ ์ ์ ์๋ฃ๋ค๊ณผ ๋น๊ตํ์ฌ ์ฝ์ ํ ์์น๋ฅผ ์ง์ ํ ํ ์๋ฃ๊ฐ ์ฝ์ ๋ ์์น๋ฅผ ์ฐพ๋ ์ ๋ ฌ ๋ฐฉ์์ ๋๋ค.
ํฉ๋ณ์ ๋ ฌ : ๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋๋ก ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋๊ฐ๋ก ๋ถ๋ฅํ๊ณ ๊ฐ๊ฐ์ ํด๊ฒฐํ ํ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ์์ ์๋์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ์์ ๋๋ค.
ํต์ ๋ ฌ(์ค์!)
ํต์ ๋ ฌ : ๊ฐ์ฅ๋น ๋ฅธ ์ ๋ ฌ๋ฐฉ์์ค ํ๋๋ก์ ๋ค๋ฅธ์์์ ๋น๊ต๋ง์ผ๋ก ์ ๋ ฌ์ ์ํํ๋ ๋น๊ต์ ๋ ฌ์ด์ ๋ถํ ํด์ ์ ๋ ฌ์ ์ํํ๋ฏ๋ก ๋ถํ ์ ๋ณต์ ๋ ฌ์๋ ์ํฉ๋๋ค.
์ ์ผ ์ค์ํ ์ ๋ ฌ ๋ฐฉ์์ด๋ฏ๋ก ์กฐ๊ธ ๊ธธ๊ฒ ์จ๋ณด๊ฒ ์ต๋๋ค.
ํต์ ๋ ฌ์ Pivot Point๋ผ๊ณ ํ๋ ๊ธฐ์ค๊ฐ์ ํ๋ ์ค์ ํฉ๋๋ค. ์ด ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์์๊ฐ์ ์ผ์ชฝ, ํฐ ๊ฐ์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฎ๊ธฐ๋ ๋ฐฉ์์ผ๋ก ์ ๋ ฌ์ ์งํํฉ๋๋ค. ์ด๋ฅผ ๋ฐ๋ณตํ์ฌ ๋ถํ ๋ ๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ 1์ด๋๋ฉด ๋ฐฐ์ด์ด ๋ชจ๋ ์ ๋ ฌ ๋ ๊ฒ์ ๋๋ค.
์งํ๋ฐฉ์์ ์์๋๋ก ์ ๋ฆฌํ์๋ฉด
1. ๋งจ ์์ ์ซ์๋ฅผ ํผ๋ด์ผ๋ก ์ง์ ํฉ๋๋ค.
2. ํผ๋ด์ ๋ค์ ์ธ๋ฑ์ค๋ฅผ i, ๋ฐ์ดํฐ์ ๋งจ ๋์ j๋ก ์ง์ ํ๊ณ
3. i๋ ์ฆ๊ฐ ์ฐ์ฐํ๋ฉด์ pivot๋ณด๋ค ํฐ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ณ j๋ ๊ฐ์ ์ฐ์ฐํ๋ฉด์ pivot๋ณด๋ค ์์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ต๋๋ค.
4. ๋ง์ฝ i์ j๊ฐ ๊ต์ฐจ๋์ง ์๊ณ ์๋ก ์๋ง์ ๊ฐ์ ์ฐพ์๋ค๋ฉด i์ ๋ฐ์ดํฐ์ j์ ๋ฐ์ดํฐ๋ฅผ ์ค์ํฉ๋๋ค.
5. ์ฐพ๋ ๋์ค i > j ๊ฐ ๋์๋ค๋ฉด pivot๊ณผ j๋ฅผ ์ค์ ํ๊ณ
6. ์ด๋ฅผ ์คํํ์๋ค๋ฉด pivot์ ์ข์ธก์ pivot๋ณด๋ค ์์ ๊ฐ๋ค๋ง ์ฐ์ธก์ ํฐ๊ฐ์๋ง ์กด์ฌํ๊ฒ๋ฉ๋๋ค.
7. ์ง๊ธ๊น์ง ์คํํ ์๊ณ ๋ฆฌ์ฆ์ pivot์ ๊ธฐ์ค์ผ๋ก ์ข์ธก์์ ์ฐ์ธก์ผ๋ก ๋ฐ๋ณตํด์ ์ํํฉ๋๋ค.(pivot์ ์ ์ธํฉ๋๋ค.)
๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๊ณ ๋น ๋ฅธ ์ ๋ ฌ์ค ํ๋์ง๋ง ๊ฐ์ ํฐ ๋จ์ ์ด ์์ต๋๋ค.
๊ธฐ์กด์ ์ด๋ฏธ ์ ๋ ฌ์ด ๋์ด์๋ ๋ฐฐ์ด์ ์ ๋ ฌํ ๊ฒฝ์ฐ O(N^2)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
์ด๋ฅผ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ฒซ์งธ, ๋ฐฐ์ด์ ์ฒซ์งธ๋ ๋ง์ง๋ง ์์๊ฐ ์๋ ๋์๋ฅผ pivot ์ผ๋ก ์ค์ ํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์ด๋ pivot์ด ํธํฅ๋๋ ๋ฌธ์ ์ ์ ํด๊ฒฐํ ์ ์์ต๋๋ค. ๋์งธ, ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ์์, ์ค๊ฐ ์์, ๋ง์ง๋ง ์์ ์ค ์ค๊ฐ ๊ฐ์ pivot์ผ๋ก ์ ํํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ด๋ ๊ฐ์ฅ ์์ ๊ฐ์ ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ์, ๊ฐ์ฅ ํฐ ๊ฐ์ ๋ฐฐ์ด์ ๋ง์ง๋ง์ ์์น์ํต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ค๊ฐ ๊ฐ์ ๋ฐฐ์ด์ ๋ง์ง๋ง์์ ๋ ๋ฒ์งธ ์ธ๋ฑ์ค ์ซ์์ ๊ตํํ๋ฉด ์ฌ๊ท ํ์๋ฅผ ์ค์ผ ์ ์๊ณ ๋ฐฐ์ด์ ๋ถํ ์ด ๊ฐ์ด๋ฐ์์ ์ํ๋ ํ๋ฅ ์ด ๋์์ง๋๋ค.
Reference