๋ฐ์ํ
๋๋ฆฌ๋ฉด O(N^2), ๋น ๋ฅด๋ฉด O(NlogN) ์ ์๊ฐ๋ณต์ก๋๋ฅผ ๋ง์กฑํ๋ ๊ธฐ๋ณธ์ ์ธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํด๋์๋ค. ์ฃผ๊ธฐ์ ์ผ๋ก ๋ค์ด์์ ๋ณต์ตํ์!
๋ชฉํ
- ์๊ฐ๋ณต์ก๋๋ฅผ ๋น๊ตํด๋ณด๋ฉฐ ๊ฐ์ข ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ํจ์จ์ฑ ๋ฐ ํน์ง์ ํ์ตํ๋ค.
Selection Sort
- ์ ํ์ ๋ ฌ์ ๊ฐ์ฅ ์์ ์๋ฅผ ์ ํํ์ฌ ๊ฐ์ฅ ๋ท์ชฝ์ผ๋ก ๋ณด๋ธ๋ค.
- O(N^2) ์ ๋ง์กฑํ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ์ค์์๋ ๋๋ฆฐ ์ถ์ ์ํ๋ค.
Code
void selection_sort(vi &array) {
for (int i=0; i<array.size(); i++) {
int min_index = i;
for (int j=i+1; j<array.size(); j++) {
if (array[min_index] > array[j]) {
min_index = j;
}
}
swap(array[i], array[min_index]);
}
}
int main()
{
vi array = {1, 10, 5, 8, 7, 6, 4, 3, 2, 9};
selection_sort(array); // O(N^2), [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
return 0;
}
Bubble Sort
- ์ธ์ ํ ๊ฐ๊ณผ ๋น๊ตํ์ฌ ๋ ์์ ๊ฐ์ ์์ผ๋ก ๋ณด๋ธ๋ค.
- ์๊ฐ๋ณต์ก๋ O(N^2) ์ ๋ฐ๋ฅธ๋ค.
- ์ ํ ์ ๋ ฌ๊ณผ ๋น๊ตํด๋ณด์์ ๋ swap ์ฐ์ฐ์ ๋ ๋ง์ด ์ฌ์ฉํ๊ณ ์๊ธฐ์ ์๋์ ์ผ๋ก ๋ ๋นํจ์จ์ ์ด๋ค.
- ํ ๋น ์ฐ์ฐ์ ๋ฉ๋ชจ๋ฆฌ -> ๋ ์ง์คํฐ, ๋์ , ๋ ์ง์คํฐ -> ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํฉ์ณ์ ๊ตฌํํ๊ธฐ ๋๋ฌธ์ ์ฐ์ฐ๋์ด ๋ ๋ง๋ค.
Code
void burble_sort(vi &array) {
for (int i=0; i<array.size(); i++) {
for (int j=0; j<array.size()-1-i; j++) {
if (array[j] > array[j+1]) {
swap(array[j], array[j+1]);
}
}
}
}
int main()
{
vi array = {1, 10, 5, 8, 7, 6, 4, 3, 2, 9};
burble_sort(array); // O(N^2), [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
return 0;
}
Insertion Sort
- ์ ๋ ฌ๋ ๋ถ๋ถ๊ณผ ์ ๋ ฌํด์ผํ ๋ถ๋ถ์ผ๋ก ๋๋ ๋ ์ ๋ ฌํ ์นด๋๋ฅผ ์ ๋ ฌ๋ ๋ถ๋ถ์ ์ ์ ์์น์ ์ฝ์ ํ๋ค.
- ๋ฐ์ดํฐ๊ฐ ๊ฑฐ์ ์ ๋ ฌ๋์ด ์๋ ๊ฒฝ์ฐ ๊ฐ์ฅ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ด๋ค.
Code
void insertion_sort(vi &array) {
for (int i=0; i<array.size(); i++) {
for (int j=i; j>0; j--) {
if (array[j-1] > array[j]) {
swap(array[j], array[j-1]);
}
}
}
}
int main()
{
vi array = {1, 10, 5, 8, 7, 6, 4, 3, 2, 9};
insertion_sort(array); // O(N^2), [1, 2, 3, 4, 5, 6, 7, 8, 9]
return 0;
}
Quick Sort
- ํน์ ๊ธฐ์ค๊ฐ์ผ๋ก ํฐ์์ ์์์๋ฅผ ๋๋ ๋ค์ ์ ๋ ฌ ํ๋ค.
- ํต์ ๋ ฌ์ ๊ตฌํ์๋ ๋ถํ ์ ๋ณต ๊ธฐ๋ฒ์ด ์จ์ด์๋ค.
- ํ๊ท O(NlogN) ์ ๋ง์กฑํ๋ฉฐ ์ต์ ์ ๊ฒฝ์ฐ O(N^2) ์ ๋ง์กฑํ ์ ์๋ค.
- ์ต์ ์ ๋ฐ์ดํฐ๊ฐ ๊ฑฐ์ ์ ๋ ฌ๋์ด ์์ ๊ฒฝ์ฐ์ด๋ค.
- ๋ฐ์ดํฐ ํน์ฑ์ ์๋ง๊ฒ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ์ ํ ํ์ํจ.
Code
void quick_sort(vi &array, int start, int end) {
if (start >= end) return;
int pivot = start;
int i = pivot+1; int j = end;
while (i <= j) {
while (i <= end && array[pivot] >= array[i]) i++;
while (j > start && array[pivot] <= array[j]) j--;
int idx = (i > j)? pivot:i;
swap(array[idx], array[j]);
}
quick_sort(array, start, j-1);
quick_sort(array, j+1, end);
}
void quick_sort(vi array) {
quick_sort(array, 0, array.size()-1);
to_string(array);
}
int main()
{
vi array = {1, 10, 5, 8, 7, 6, 4, 3, 2, 9};
quick_sort(array); // AVG: O(NlogN) Worst Case: O(N^2) (sorted array)
return 0;
}
Merge Sort
- ์์ ๋จ์๋ก ๋ถํ ํ์ฌ ๋ค์ด๊ฐ๋ค๊ฐ ์ ๋ ฌํ๋ฉด์ ๋์จ๋ค.
- ๋ณํฉ ์ ๋ ฌ์ ๊ตฌํ์๋ ์ฌ๊ทํจ์๋ฅผ ํ์ฉํ ๋ถํ ์ ๋ณต ๊ธฐ๋ฒ์ด ์จ์ด์๋ค.
- ์ ์ญ๋ณ์๋ก ์ค์ ๋ ์๋น sorted ๋ฐฐ์ด์ด ํ์ํ๋ค.
- ํ๊ท O(NlogN) ์ ๋ง์กฑํ์ง๋ง ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋นํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๋ค.
Code
void merge(vi &array, vi &sorted, int start, int mid, int end) {
int i = start; int j = mid+1; int k = start;
while (i<=mid && j<=end) {
sorted[k++] = (array[i] <= array[j])? array[i++]:array[j++];
}
int index = (i>mid)? j:i;
for (int m=index; m<=end; m++) {
sorted[k++] = array[m];
}
for (int m=start; m<=end; m++) {
array[m] = sorted[m];
}
}
void merge_sort(vi &array, vi &sorted, int start, int end) {
if (start >= end) return;
int mid = (start + end) / 2;
merge_sort(array, sorted, start, mid);
merge_sort(array, sorted, mid+1, end);
merge(array, sorted, start, mid, end);
}
void merge_sort(vi array) {
vi sorted(array.size(), 0);
merge_sort(array, sorted, 0, array.size()-1);
}
int main()
{
vi array = {1, 10, 5, 8, 7, 6, 4, 3, 2, 9};
merge_sort(array); // AVG: O(NlogN) Worst Case: Time Complexity O(NlogN)
return 0; // But large memory use
}
Heap Sort
- Binary Tree (์ด์ง ํธ๋ฆฌ): ๋ชจ๋ ๋ ธ๋์ ์์ ๋ ธ๋๊ฐ 2๊ฐ ์ดํ์ธ ๊ตฌ์กฐ
- Complete Binary Tree (์์ ์ด์ง ํธ๋ฆฌ): ๋ฐ์ดํฐ๊ฐ Root ๋ถํฐ ์์ํด์ ์์๋ ธ๋์ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ ์์๋๋ก ์ฑ์์ง๋ ์ด์งํธ๋ฆฌ๊ตฌ์กฐ
- Heap: ์ต์๊ฐ์ด๋ ์ต๋๊ฐ์ ๋น ๋ฅด๊ฒ ์ฐพ์๋ด๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์์ ์ด์งํธ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ํธ๋ฆฌ๊ตฌ์กฐ
- Max Heap: ๋ถ๋ชจ๋ ธ๋ > ์์๋ ธ๋ ๊ด๊ณ๋ฅผ ๋ง์กฑํ๋ค
- Min Heap: ๋ถ๋ชจ๋ ธ๋ < ์์๋ ธ๋ ๊ด๊ณ๋ฅผ ๋ง์กฑํ๋ค
- Heapify ํ ์์ฑ ์๊ณ ๋ฆฌ์ฆ์ ํตํ์ฌ Heap Sort ๋ฅผ ๊ตฌํํ ์ ์๋ค.
Code
void heap_sort(vi array) {
const int SIZE = array.size();
for (int i=1; i<SIZE; i++) {
int ptr = i;
while (ptr != 0) {
int root = (ptr-1) / 2;
if (array[root] < array[ptr]) {
swap(array[ptr], array[root]);
}
ptr = root;
}
}
for (int i=SIZE-1; i>=0; i--) {
swap(array[0], array[i]);
int root = 0; int c = 1;
while (c < i) {
c = 2 * root + 1;
if (c < i - 1 && array[c] < array[c+1]) {
c++;
}
if (c < i && array[root] < array[c]) {
swap(array[root], array[c]);
}
root = c;
}
}
}
int main()
{
vi array = {1, 10, 5, 8, 7, 6, 4, 3, 2, 9};
heap_sort(array); // AVG: O(NlogN)
return 0;
}
Counting Sort
- ์์ ๋ฒ์์ ๋ํด์ ๊ฐ์ ๊ฐ์๋ฅผ ์ธ์ด ์์ฐจ์ ์ผ๋ก ์ถ๋ ฅํ๋ค
- ๋ฒ์ ๋งํผ ๋ฐฐ์ด์ ์์ฑํ ๋ค์ ๋ฐฐ์ด๊ฐ์ด ์กด์ฌํ๋ ๋งํผ ํด๋น ์ธ๋ฑ์ค๋ฅผ ์ถ๋ ฅํ๋ฉด ๋๋ค.
- ์๊ฐ๋ณต์ก๋ O(N) ์ ๋ง์กฑํ๊ธฐ ๋๋ฌธ์ O(NlogN) ์ด ์๋จนํ๋ฉด ํ๋ฒ์ฏค ์๊ฐํด๋ณผ๋งํ๋ค.
๋ฐ์ํ
'๐ฅ Computer Science > Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ๋ฐฑ์ค 16236 ์๊ธฐ์์ด (0) | 2020.08.23 |
---|---|
[C++] ๋ณด๊ดํจ (0) | 2019.10.19 |
[C++] ํ๋ก๊ทธ๋๋ฐ์ ์ํ ํ ํ๋ฆฟ (Cheat sheet) (0) | 2019.10.05 |