- nestjs
- C++
- ๋ฐฑ์ค
- ์นด์นด์ค2021
- Union-Find
- ์๊ณ ๋ฆฌ์ฆ
- ๋์ ํ๋ก๊ทธ๋๋ฐ
- DFS
- ๋นํธ๋งต
- ํ๋ก๊ทธ๋๋จธ์ค
- Python
- ๊ฐ์ฅ๊ฐ๊น์ด๊ณตํต์กฐ์
- ์ํฐ๋
- ์ด๋ถํ์
- js
- DP
- LCs
- ๋นํธ๋ง์คํน
- ์ฌ๊ท
- golang
- ๋ฐฑ์๋ ํ๋ฆฌ์จ๋ณด๋ฉ
- ํ๋ฆฌ์จ๋ณด๋ฉ
- ๋ค์ต์คํธ๋ผ
- BFS
- ์นด์นด์ค ์ฝํ
- go
- ์์ฝ๋
- ์ฌ๋ผ์ด๋ฉ ์๋์ฐ
- ์น๋ฆฐ์ด
- ํธ๋ฆฌ
- Today
- Total
Hello Ocean! ๐ผ
[์๊ณ ๋ฆฌ์ฆ] ์ ๋ ฌ(์ฝ์ , ๋ฒ๋ธ, ํต) ๋ณธ๋ฌธ
์ ๋ ฌ (Sort)
n๊ฐ์ ์ซ์๊ฐ ์ฃผ์ด์ก์ ๋, ์ด๋ฅผ ํน์ ํ ๊ธฐ์ค(์ค๋ฆ์ฐจ์, ๋ด๋ฆผ์ฐจ์ ๋ฑ)์ ๋ง๊ฒ ์ ๋ ฌํ์ฌ ์ถ๋ ฅํ๋ ์๊ณ ๋ฆฌ์ฆ
๋งค์ฐ ๋ค์ํ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด ์กด์ฌํ๊ณ , ๊ฐ ์๊ณ ๋ฆฌ์ฆ๋ง๋ค ์ํ์๊ฐ์ด ๋ค๋ฅด๋ค.
์ฝ์ ์ ๋ ฌ
k๋ฒ์งธ ์์๋ฅผ 1๋ถํฐ k-1๊น์ง์ ์ซ์์ ๋น๊ตํด ์ ์ ํ ์์น์ ๋ผ์ ๋ฃ๊ณ , ๊ทธ ๋ค์ ์๋ฃ๋ฅผ ํ ์นธ์ฉ ๋ค๋ก ๋ฐ์ด๋ด๋ ๋ฐฉ์.
์๋ฃ๊ตฌ์กฐ์ ๋ฐ๋ผ์ ๋ค๋ก ๋ฐ์ด๋ด๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด ํด ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ญ์์ผ๋ก ์ ๋ ฌ๋์ด์์ ๊ฒฝ์ฐ์ ๋งค์ฐ ์ค๋๊ฑธ๋ฆฐ๋ค.
๋ฐ๋ฉด์ ์ด๋ฏธ ์ ๋ ฌ๋์ด ์๋ ์๋ฃ๊ตฌ์กฐ์ ์๋ฃ๋ฅผ ํ๋์ฉ ์ฝ์ /์ญ์ ํ๋ ๊ฒฝ์ฐ์๋ ์ต๊ณ ์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด ๋๋ค.
๊ตฌํ์ด ๋งค์ฐ ์ฝ๋ค.
์ด๋ฏธ์ง ์ถ์ฒ - ๋๋ฌด์ํค
์ด์ง ์ฝ์ ์ ๋ ฌ
์ด์ง ํ์์ ํ์ฉํด์ ์๋ก์ด ์์๊ฐ ์์นํ ๊ณณ์ ๋ฏธ๋ฆฌ ์ฐพ์์ ์ ๋ ฌํ๋ ๋ฐฉ์
์์ ํฌ๊ธฐ ๋น๊ตํ๋ ๋ถ๋ถ์ logN ์์ค์ผ๋ก ๋ฎ์ถ์ด ์กฐ๊ธ ๋ ๋น ๋ฅด๊ฒ ์ ๋ ฌ์ ์ํํ ์ ์๋ค.
์๊ฐ๋ณต์ก๋ & ๊ณต๊ฐ๋ณต์ก๋
์๊ฐ๋ณต์ก๋
์ต์ ์ ๊ฒฝ์ฐ : O(n^2)
์ต์ ์ ๊ฒฝ์ฐ : O(n)
๊ณต๊ฐ๋ณต์ก๋
- O(1)
์ฝ๋
#include<stdio.h>
#include<stdlib.h>
#define MAX_SIZE 100000
int main(void) {
int list[MAX_SIZE]; int i,j,temp;
srand((unsigned int)time(NULL));
for (i = 0;i<MAX_SIZE;i++) list[i] = rand()%MAX_SIZE+1;
int key;
for(i=1; i<MAX_SIZE; i++){
key = list[i];
for(j=i-1; j>=0 && list[j]>key; j--) list[j+1] = list[j];
list[j+1] = key;
}
return 0;
}
๋ฒ๋ธ์ ๋ ฌ
์๋ก ์ธ์ ํ ์์๋ฅผ ์ฐจ๋ก๋ก ๊ฒ์ฌํด ๋๊ฐ๋ฉด์ ์ ๋ ฌํ๋ ๋ฐฉ์
1๋ฒ์งธ์ 2๋ฒ์งธ ์์๋ฅผ ๋น๊ตํ์ฌ ์ ๋ ฌํ๊ณ , 2๋ฒ์งธ์ 3๋ฒ์งธ, ... , n-1๋ฒ์งธ์ n๋ฒ์งธ๋ฅผ ์ ๋ ฌํ ๋ค, ๋ค์ 1๋ฒ์งธ์ 2๋ฒ์งธ ~ n-2๋ฒ์งธ์ n-1๋ฒ์งธ๋ฅผ ๋น๊ตํด๋๊ฐ๋ ๋ฐฉ์ (์ต๋ n(n-1)/2 ๋ฒ ์ ๋ ฌ)
1ํ์ ํ ๋ ๋ง๋ค ๋ง์ง๋ง ํ ๊ฐ๊ฐ ์ ๋ ฌ๋๋ฏ๋ก ์์๋ค์ด ๊ฑฐํ์ฒ๋ผ ์ฌ๋ผ์ค๋ ๊ฒ์ฒ๋ผ ๋ณด์ฌ์ ๋ฒ๋ธ ์ ๋ ฌ์ด๋ค.
1ํ์ ๋ง๋ค ํ๋์ฉ ์ ๋ ฌ์์ ์ ์ธ๋จ
๋๋ถ๋ถ์ ์ํฉ์์ ์ต์ ์ ์ฑ๋ฅ์ ๋ณด์ฌ์ฃผ์ง๋ง, ์ด๋ฏธ ์ ๋ ฌ๋ ์๋ฃ์์๋ ํ ๋ฒ๋ง ๋๋ฉด ๋๊ธฐ ๋๋ฌธ์ ์ต์ ์ ์ฑ๋ฅ์ ๋ณด์ฌ์ค๋ค.
๊ฐ์ฅ ์์ฝ๊ฒ ๊ตฌํํ์ฌ ์ฌ์ฉํ ์ ์์ง๋ง, ์๊ณ ๋ฆฌ์ฆ์ ๊ด์ ์์๋ ๋๋จํ ๋นํจ์จ์ ์ธ ๋ฐฉ์์ด๋ค.
SWAP์ด MOVE๋ณด๋ค ๋ ๋ณต์กํ๊ธฐ ๋๋ฌธ์ ๊ฑฐ์ ์ฐ์ด์ง ์๋๋ค.
์๊ฐ๋ณต์ก๋ & ๊ณต๊ฐ๋ณต์ก๋
์๊ฐ๋ณต์ก๋
O(n^2)
๊ณต๊ฐ๋ณต์ก๋
O(1)
#include<stdio.h>
#include<stdlib.h>
#define MAX_SIZE 100000
int main(void){
int list[MAX_SIZE];
int i,j,temp;
srand((unsigned int)time(NULL));
for (i = 0;i<MAX_SIZE;i++) list[i] = rand()%MAX_SIZE+1;
for (i=0;i<MAX_SIXE;i++){
for (j=0;j<MAX_SIZE-i ; j++){
if(list[j] > list[j+1]){
//SWAP
temp = list[j];
list[j] = list[j+1];
list[j+1] = temp;
}
}
}
return 0;
}
ํต์ ๋ ฌ
'quick'์ด๋ผ๋ ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด ํ๊ท ์ ์ธ ์ํฉ์์ ์ต๊ณ ์ ์ฑ๋ฅ
๊ฑฐ์ ๋ชจ๋ ์ธ์ด์์ ์ ๊ณตํ๋ ์ ๋ ฌํจ์๋ ํต ์ ๋ ฌ ํน์ ์ด๋ฅผ ๋ณํํ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉ
์ ์ ํ ์์ ํ๋๋ฅผ pivot์ผ๋ก ์ ํด์, ๊ทธ๋ณด๋ค ์์ ๊ฒ์ ์์ผ๋ก ๋นผ๋ด๊ณ , ํฐ ๊ฒ์ ๋ค๋ก ๋ณด๋ด์ pivot์ ๊ธฐ์ค์ผ๋ก ์์๊ฒ, ํฐ ๊ฒ์ผ๋ก ๋๋ ๋ค์ ๊ฐ๊ฐ์์ ๋ค์ ํผ๋ฒ์ ์ ํด์ ๋๋์ด์ง ๊ณต๊ฐ์ ํฌ๊ธฐ๊ฐ 0์ด๋ 1์ด ๋ ๋ ๊น์ง ์ ๋ ฌํ๋ค.
์ด๋ ๊ฒ pivot์ ์ก๊ณ ์์ ์์๋ค์ ์ผ์ชฝ์ผ๋ก, ํฐ ์์๋ค์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋๋๋ ๋ฐฉ์์ partition step์ด๋ผ๊ณ ํ๋ฉฐ, ์ด ๊ฒ์ ์ด๋ป๊ฒ ํ๋๋์ ๋ฐ๋ผ ์ฑ๋ฅ์ฐจ์ด๊ฐ ๋ฐ์ํ๋ค.
- ๋๊บผ์ด ํ ๋๋ฆฌ์์ 5๊ฐ pivot์ด๋ค. ํ๋์์ pivot๋ณด๋ค ์์ ์, ๋นจ๊ฐ์์ pivot๋ณด๋ค ํฐ ์์ด๋ค
์๊ฐ๋ณต์ก๋ & ๊ณต๊ฐ๋ณต์ก๋
์๊ฐ๋ณต์ก๋
- ์ต์ ์ ๊ฒฝ์ฐ : O(n^2)
ํผ๋ฒ์ ๊ณ์ ์ต๋๊ฐ์ด๋ ์ต์๊ฐ์ผ๋ก ์ก๋ ๊ฒฝ์ฐ
๋ฐ๋ผ์ ํผ๋ฒ์ ๋๋ค์ผ๋ก ์ ํ๊ฑฐ๋, ๋ช ๊ฐ๋ฅผ ๋ฝ์ ์ค์๊ฐ์ผ๋ก ์ ํ๋ ๋ฑ์ ๋ฐฉ์์ ์ฌ์ฉํ๊ธฐ๋ ํ๋ค.
๊ณต๊ฐ๋ณต์ก๋
O(logN)
์ฝ๋
#include <stdio.h>
#define MAX_SIZE 100000
#define SWAP(x,y,t) ( (t)=(x), (x)=(y), (y)=(t))
int list[MAX_SIZE];
int partition(int list[], int left, int right) { //๋ถํ ์๊ณ ๋ฆฌ์ฆ
int pivot, temp, low, high;
low = left;
high = right + 1;
pivot = list[left]; //์ ์ผ ์ผ์ชฝ์์๋ฅผ pivot์ผ๋ก ์ค์
do {
do low++; // ํผ๋ด ๋ค์๋ถํฐ low
// list[low] < pivot ์ผ ๋ low ์ฆ๊ฐ
while (low <= right && list[low] < pivot);
do high--; //list[right] ๋ถํฐ ์์
// list[high] > pivot์ผ ๋ high ๊ฐ์
while (high >= left && list[high] > pivot);
if (low < high) SWAP(list[low], list[high], temp);
} while (low < high);
SWAP(list[left], list[high], temp);
return high; //pivot index
}
void quick_sort(int list[], int left, int right)
{
if (left<right) {
int q = partition(list, left, right); //pivot index
quick_sort(list, left, q - 1); //ํผ๋ด ์ ์ธํ๊ณ ๋ค์ ํต์ํธ
quick_sort(list, q + 1, right);
}
}
int main(void) {
int i;
srand(time(NULL));
for (i = 0; i < MAX_SIZE; i++)
list[i] = rand() % MAX_SIZE+1;
quick_sort(list, 0, MAX_SIZE - 1);
return 0;
}
์ฐธ๊ณ ์๋ฃ
[https://namu.wiki/w/%EC%A0%95%EB%A0%AC%20%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98](https://namu.wiki/w/์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ)
https://gmlwjd9405.github.io/2018/05/06/algorithm-bubble-sort.html
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ํ์ ์๊ณ ๋ฆฌ์ฆ (์ ํ, ์ด๋ถ, ํด์, BST) (0) | 2020.08.31 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค/C++] H-index , K๋ฒ์งธ ์ (0) | 2020.08.31 |
[์คํฐ๋] ๋นํธ์กฐ์ , ์์ ํ์ (0) | 2020.08.03 |
[์๊ณ ๋ฆฌ์ฆ ์คํฐ๋] ์๋ฃ๊ตฌ์กฐ_2 (0) | 2020.07.28 |
[์๊ณ ๋ฆฌ์ฆ ์คํฐ๋] ์๋ฃ๊ตฌ์กฐ_1 (0) | 2020.07.20 |