sort jihoon - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki
์ฝ์ ์ ๋ ฌ(Insertion sort)
- ์ ๋ ฌ๋์ด ์๋ ๋ฐฐ์ด์ ์์ง ์ ๋ ฌ๋์ง ์์ ์์์ ๋ค์ด๊ฐ ์์น๋ฅผ ์ฐพ์ ์ฝ์ ํ๋ ์ ๋ ฌ
- ์ ๋ ฌ๋์ด ์์ ๋ ๊ฐ์ฅ ํจ์จ์ด ๋๋ค. ์ ๋ ฌ๋์ด ์๋ ๋ฐฐ์ด์ ๊ฐ์ฅ ๋์ ์๋ ์์๋ง ์ ๋ ฌ๋์ง ์์ ์์์ ๋น๊ตํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ด๋ค. O(N)
- ์๊ฐ ๋ณต์ก๋
- ํ๊ท : O(N^2)
- ์ต์ : O(N)
- ์ต์ : O(N^2)
// ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
void insertionSort(int arr[], int N)
{
for (int i = 1; i < N; i++)
{
int key = arr[i];
for (int j = i-1; j >= 0; j--)
{
if (key < arr[j])
arr[j+1] = arr[j];
else
break;
}
arr[j+1] = key;
}
}
์ ํ ์ ๋ ฌ(Selection sort)
- ๋งค๋ฒ ๊ทธ ๋์ ๊ฐ์ฅ ์์(ํฐ) ์์์ index๋ฅผ ์ฐพ์๋ด์ด ํ์ฌ index์ ์์์ swapํ๋ ์ ๋ ฌ
- ์๊ฐ ๋ณต์ก๋
- ํ๊ท : O(N^2)
- ์ต์ : O(N^2)
- ์ต์ : O(N^2)
์ฝ๋
void selectionSort(int arr[], int N) {
// ๋ง์ง๋ง ์ซ์๋ ์๋์ผ๋ก ์ ๋ ฌ๋๊ธฐ ๋๋ฌธ์ (์ซ์ ๊ฐ์-1) ๋งํผ ๋ฐ๋ณตํ๋ค.
for(int i = 0; i < N-1; i++) {
int minIndex = i;
// ์ต์๊ฐ์ ํ์ํ๋ค.
for(int j = i+1; j < N; j++) {
if(arr[j] < arr[minIndex])
minIndex = j;
}
// ์ต์๊ฐ์ด ์๊ธฐ ์์ ์ด๋ฉด swap ํ์ง ์๋๋ค.
if(i != minIndex)
swap(arr[i], arr[minIndex]);
}
}
๋ฒ๋ธ ์ ๋ ฌ(Bubble sort)
- ์๋ก ์ธ์ ํ ๋ ์์๋ฅผ ๊ฒ์ฌํ์ฌ ์ ๋ ฌํ๋ ์๊ณ ๋ฆฌ์ฆ
- ์ธ์ ํ 2๊ฐ์ ๋ ์ฝ๋๋ฅผ ๋น๊ตํ์ฌ ํฌ๊ธฐ๊ฐ ์์๋๋ก ๋์ด ์์ง ์์ผ๋ฉด swapํ๋ค.
- ์๊ฐ ๋ณต์ก๋
- ํ๊ท : O(N^2)
- ์ต์ : O(N^2)
- ์ต์ : O(N^2)
์ฝ๋
void bubble_sort(int arr[], int N){
for(int i = N-1; i > 0; i--) {
for(j=0; j < i; j++) {
// j๋ฒ์งธ์ j+1๋ฒ์งธ์ ์์๊ฐ ์์๋๋ก ๋์ด ์์ง ์์ผ๋ฉด swap
if(list[j] < list[j+1]) {
swap(arr[j], arr[j+1]);
}
}
}
}
ํต ์ ๋ ฌ(quick sort)
- pivot์ ์์น๋ฅผ ์ฐพ์๊ฐ๋ฉด์ ์งํ๋๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
- pivot๋ณด๋ค ์์ ํน์ ํฐ ์์์ ๊ฐ์๋ง ์๋ฉด pivot์ ์ต์ข ์์น๋ฅผ ์ ์ ์๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ฅ ๋น ๋ฅธ ์ ๋ ฌ
- ์ด๋ฏธ ์ ๋ ฌ๋์ด ์์ ๊ฒฝ์ฐ **O(N^2)**๋ก, ํจ์จ์ด ๊ฐ์ฅ ๋ฎ๋ค.
- ์ฌ๊ท ํจ์๊ฐ 1๊ณผ N-1, N-1์ด ๋ค์ 1๊ณผ N-2, ... ๋ถํ ์ด N๋งํผ ์ผ์ด๋๋ค.
- N-1 + N-2 + N-3 + ... + 1 = (N-1)*N/2 => O(N^2)
- divide and conquer(๋ถํ ์ ๋ณต) ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํ๋๋ค.(์ฌ๊ท ํจ์)
- in-place ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ(๊ทธ ์๋ฆฌ์์ ๊ฐ์ ๋ฐ๊พธ๋ ์๊ณ ๋ฆฌ์ฆ)
- cache hit rate๊ฐ ์ข๋ค.
- pivot์ ์ด์ฉํ๋ฏ๋ก ์๊ฐ ์ง์ญ์ฑ ๋๊ณ , ์์ฐจ์ ์ผ๋ก ๋ฐฐ์ด์ ์ ๊ทผํ๋ฉด์ ๋น๊ตํ๊ธฐ ๋๋ฌธ์ ๊ณต๊ฐ ์ง์ญ์ฑ์ด ๋๋ค.
- ์๊ฐ ๋ณต์ก๋
- ํ๊ท : O(NlogN)
- ์ต์ : O(NlogN)
- ์ต์ : O(N^2)
- ๊ณต๊ฐ ๋ณต์ก๋ : O(logN) ~ O(N)
- ํต ์ ๋ ฌ์์๋ ์ฌ๊ท์ ์ธ ํธ์ถ์ ์ด์ฉํ๊ธฐ ๋๋ฌธ์ ์คํ์ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ณ๋๋ก ํ์ํ๋ค. ์คํ์ ์๋ชจ๋๋ ๋ฉ๋ชจ๋ฆฌ๋ ์ฌ๊ท ํจ์์ ๊น์ด์ ๋น๋กํ๊ฒ ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๋ถํ ์ด ์ด์์ ์ผ๋ก ์ด๋ฃจ์ด์ง ๊ฒฝ์ฐ O(logN)์ ์คํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์์๋๋ค. ์ต์ ์ ๊ฒฝ์ฐ, ์ฆ ๋ถํ ์ด ํ์ชฝ์ผ๋ก๋ง ์ด๋ฃจ์ด์ง ๊ฒฝ์ฐ์๋ O(N)์ ์คํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํ๋ค
์ฝ๋
์ ํด์ง pivot๋ณด๋ค ์์(๋๋ ํฐ) ์์๊ฐ ๋ช ๊ฐ์ธ์ง ์๋ฉด ํด๋น pivot์ ํด๋นํ๋ ์์๊ฐ ์ ๋ ฌํ์ ๋ ๋ช ๋ฒ์งธ ์์น์ธ์ง ์ ์ ์๋ค.
์๋์ ์ฝ๋๋ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ์ด๋ค.
left๊ฐ start+1๋ถํฐ ์์ํ๊ฒ ๋๋ฉด ์์๊ฐ 2๊ฐ์ธ ๊ฒฝ์ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์, start๋ถํฐ ์์ํ๊ฒ ๋๋ค.
while (arr[left] <= pivot && left < end)
์๋ง left < end
์กฐ๊ฑด์ด ์๋ ์ด์ ๋ while(pivot < arr[right])
์์๋ ํญ์ right๊ฐ pivot์์น์ ๊ฐ๊ฒ ๋๋ฉด ํด๋น while์ด ์ข
๋ฃ๋๊ธฐ ๋๋ฌธ์ด๋ค.
๊ฒฐ๊ตญ ์ต์์ while์ด ์ข ๋ฃ๋ ํ์ right๋ ํญ์ pivot๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๊ฐ์ ๊ฐ๋ ๋ถ๋ถ ์งํฉ์ ๋ง์ง๋ง index๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ต์์ while๋ฌธ ๋ฐ์์ pivot์ ์์น์ธ start์ right(pivot๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๊ฐ์ ๊ฐ๋ ๋ถ๋ถ ์งํฉ์ ๋ง์ง๋ง index)์ swapํ๊ฒ ๋๊ณ , pivot ์์ชฝ์ผ๋ก ์ฌ๊ท ํจ์๋ฅผ ํธ์ถํ๋ค.
void quickSort(int arr[], int start, int end)
{
if (start >= end)
return;
int pivot = arr[start];
int left = start;
int right = end;
while (left < right)
{
while (arr[left] <= pivot && left < end)
left++;
while (pivot < arr[right])
right--;
if (left < right)
swap(arr[left], arr[right]);
}
swap(arr[start], arr[right]);
quickSort(arr, start, right - 1);
quickSort(arr, right + 1, end);
}
ํฉ๋ณ ์ ๋ ฌ(Merge sort)
- 'divide-and-conquer'(์ฌ๊ท) ๋ฐ ๊ฒฐํฉ(๋ ๊ฐ์ ๋ฐฐ์ด์ ์์์ ๋ง๊ฒ ํ๋์ ๋ฐฐ์ด๋ก ํฉ์น๋ ๊ณผ์ )์ผ๋ก ๊ตฌํ๋๋ค.
- ์๊ฐ ๋ณต์ก๋
- ํ๊ท : O(NlogN)
- ์ต์ : O(NlogN)
- ์ต์ : O(NlogN)
int sorted[MAX_SIZE] // ์ถ๊ฐ ๊ณต๊ฐ
// i: ์ ๋ ฌ๋ ์ผ์ชฝ ๋ฆฌ์คํธ์ ๋ํ ์ธ๋ฑ์ค
// j: ์ ๋ ฌ๋ ์ค๋ฅธ์ชฝ ๋ฆฌ์คํธ์ ๋ํ ์ธ๋ฑ์ค
// k: ์ ๋ ฌ๋ ๋ฆฌ์คํธ์ ๋ํ ์ธ๋ฑ์ค
/* 2๊ฐ์ ์ธ์ ํ ๋ฐฐ์ด arr[left...mid]์ arr[mid+1...right]์ ํฉ๋ณ ๊ณผ์ */
/* (์ค์ ๋ก ์ซ์๋ค์ด ์ ๋ ฌ๋๋ ๊ณผ์ ) */
void merge(int arr[], int left, int mid, int right) {
int i, j, k, l;
i = left;
j = mid + 1;
k = left;
/* ๋ถํ ์ ๋ ฌ๋ arr์ ํฉ๋ณ */
while(i <= mid && j <= right) {
if(arr[i] <= arr[j])
sorted[k++] = arr[i++];
else
sorted[k++] = arr[j++];
}
// ๋จ์ ์๋ ๊ฐ๋ค์ ์ผ๊ด ๋ณต์ฌ
if (i > mid) {
for (l = j; l <= right; l++)
sorted[k++] = arr[l];
}
// ๋จ์ ์๋ ๊ฐ๋ค์ ์ผ๊ด ๋ณต์ฌ
else {
for (l = i; l <= mid; l++)
sorted[k++] = arr[l];
}
// ๋ฐฐ์ด sorted[](์์ ๋ฐฐ์ด)์ ๋ฆฌ์คํธ๋ฅผ ๋ฐฐ์ด arr[]๋ก ์ฌ๋ณต์ฌ
for (l = left; l <= right; l++){
arr[l] = sorted[l];
}
}
// ํฉ๋ณ ์ ๋ ฌ
void mergeSort(int arr[], int left, int right) {
int mid;
if (left < right) {
mid = (left + right)/2; // ์ค๊ฐ ์์น๋ฅผ ๊ณ์ฐํ์ฌ ๋ฆฌ์คํธ๋ฅผ ๊ท ๋ฑ ๋ถํ -๋ถํ (Divide)
mergeSort(arr, left, mid); // ์์ชฝ ๋ถ๋ถ ๋ฆฌ์คํธ ์ ๋ ฌ -์ ๋ณต(Conquer)
mergeSort(arr, mid+1, right); // ๋ค์ชฝ ๋ถ๋ถ ๋ฆฌ์คํธ ์ ๋ ฌ -์ ๋ณต(Conquer)
merge(arr, left, mid, right); // ์ ๋ ฌ๋ 2๊ฐ์ ๋ถ๋ถ ๋ฐฐ์ด์ ํฉ๋ณํ๋ ๊ณผ์ -๊ฒฐํฉ(Combine)
}
}
6. ํ ์ ๋ ฌ(Heap sort)
- heap
- ์ต์๊ฐ ํน์ ์ต๋๊ฐ์ด root์ ์กด์ฌํ๋ ์์ ์ด์ง ํธ๋ฆฌ
- ๋ถ๋ชจ ๋ ธ๋์ ํค ๊ฐ์ด ์์ ๋ ธ๋์ ํค ๊ฐ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ์์ ์ด์ง ํธ๋ฆฌ
- ์ฐ์ ์์ ํ๋ก ๊ตฌํ
- heap์ ํน์ฑ์ ๊ณ์ ์ ์งํ๋ ์ ๋ ฌ(์ ์ฒด ์๋ฃ๋ฅผ ์ ๋ ฌํ๋ ๊ฒ์ด ์๋๋ค)
- ์ฝ์
- ํ์ ์๋ก์ด ์์๊ฐ ๋ค์ด์ค๋ฉด, ์ผ๋จ ์๋ก์ด ๋ ธ๋๋ฅผ ํ์ ๋ง์ง๋ง ๋ ธ๋์ ์ฝ์ ํ๋ค.
- ์๋ก์ด ๋ ธ๋๋ฅผ ๋ถ๋ชจ ๋ ธ๋๋ค๊ณผ ๊ตํํด์ ํ์ ์ฑ์ง์ ๋ง์กฑ์ํจ๋ค.
- ์ญ์
- ์ต๋ ํ์์ ์ต๋๊ฐ์ ๋ฃจํธ ๋
ธ๋์ด๋ฏ๋ก ๋ฃจํธ ๋
ธ๋๊ฐ ์ญ์ ๋๋ค.
- ์ต๋ ํ(max heap)์์ ์ญ์ ์ฐ์ฐ์ ์ต๋๊ฐ์ ๊ฐ์ง ์์๋ฅผ ์ญ์ ํ๋ ๊ฒ์ด๋ค.
- ์ญ์ ๋ ๋ฃจํธ ๋ ธ๋์๋ ํ์ ๋ง์ง๋ง ๋ ธ๋๋ฅผ ๊ฐ์ ธ์จ๋ค.
- ํ์ ์ฌ๊ตฌ์ฑํ๋ค.
- ์ต๋ ํ์์ ์ต๋๊ฐ์ ๋ฃจํธ ๋
ธ๋์ด๋ฏ๋ก ๋ฃจํธ ๋
ธ๋๊ฐ ์ญ์ ๋๋ค.
- ์๊ฐ ๋ณต์ก๋
- ํ์ ์์ ์ด์งํธ๋ฆฌ์ด๋ฏ๋ก ์ ์ฒด ๋์ด๊ฐ logN์ผ๋ก, ํ๋์ ์์๋ฅผ ํ์ ์ฝ์ ํ๊ฑฐ๋ ์ญ์ ํ ๋ ํ์ ์ฌ ์ ๋นํ๋ ์๊ฐ์ด logN๋งํผ ์์๋๋ค. ์ด N๊ฐ์ด๊ธฐ ๋๋ฌธ์ O(NlongN)์ด ์์๋๋ค.
- ์ต์ : O(NlogN)
- ํ๊ท : O(NlogN)
- ์ต์ : O(NlogN)
์๊ฐ๋ณต์ก๋ ๋น๊ต
์ด๋ฆ | ์ต์ | ํ๊ท | ์ต์ |
---|---|---|---|
์ฝ์ | N | N^2 | N^2 |
์ ํ | N^2 | N^2 | N^2 |
๋ฒ๋ธ | N^2 | N^2 | N^2 |
ํต | NlogN | NlogN | N^2 |
ํฉ๋ณ | NlogN | NlogN | NlogN |