Notice
Recent Posts
Recent Comments
tony9402
[SCCC 스터디] 선택, 퀵, 머지, 카운팅 소트 본문
반응형
이번엔 선택 정렬, 병합정렬(merge sort), 퀵 소트(quick sort), 카운팅 소트(counting sort)를 직접 구현해보았다.
1. 선택 정렬 -구현 난이도 : ●○○○○
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | #include<iostream> #include<vector> #include<algorithm> using namespace std; vector<int> list; int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin >> n; for (int i = 0; i < n; i++) { int input; cin >> input; list.push_back(input); } for (int i = 0; i < n - 1; i++) { int mini = list[i]; int index = i; for (int j = i + 1; j < n; j++) { if (mini > list[j]) { mini = list[j]; index = j; } } swap(list[i], list[index]); } for (int i = 0; i < n; i++) { cout << list[i] << '\n'; } return 0; } | cs |
2. 병합 정렬(merge sort) -구현 난이도 : ●●●○○
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | #include<iostream> #include<vector> #include<algorithm> using namespace std; vector<int> list; vector<int> save; void merge(int left, int right) { int mid = (left + right) / 2; int first = left, second = mid; int pointer = left; while (first < mid && second < right) { if (list[first] < list[second]) save[pointer++] = list[first++]; else save[pointer++] = list[second++]; } if (first != mid) for (int i = first; i < mid; i++) save[pointer++] = list[i]; else for (int i = second; i < right; i++) save[pointer++] = list[i]; for (int i = left; i < right; i++) list[i] = save[i]; return; } void mergesort(int left, int right) { if (left >= right || abs(right - left) <= 1)return; int mid = (left + right) / 2; mergesort(left, mid); mergesort(mid, right); merge(left, right); } int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin >> n; save.resize(n); for (int i = 0; i < n; i++) { int input; cin >> input; list.push_back(input); } mergesort(0, n); for (int i = 0; i < n; i++) { cout << list[i] << '\n'; } return 0; } | cs |
3. 퀵 소트 -구현 난이도 : ●●◐○○
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | #include<iostream> #include<vector> #include<algorithm> using namespace std; vector<int> list; void parition(int left, int right, int &pivotpoint) { int pivot = list[left]; int pointer = left; for (int i = left + 1; i < right; i++) if (list[i] < pivot) swap(list[i], list[++pointer]); pivotpoint = pointer; swap(list[pivotpoint], list[left]); } void quicksort(int left, int right) { int pivotpoint; if (right > left) { parition(left, right, pivotpoint); if (abs(left - pivotpoint) <= 50000) { sort(list.begin() + left, list.begin() + right); } else { quicksort(left, pivotpoint); quicksort(pivotpoint + 1, right); } } } int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin >> n; for (int i = 0; i < n; i++) { int input; cin >> input; list.push_back(input); } quicksort(0, n); for (int i = 0; i < n; i++) { cout << list[i] << '\n'; } return 0; } | cs |
4. 카운팅 소트 -구현 난이도 : ○○○○○ (엄청 쉽다)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include<iostream> using namespace std; int list[10001]; int main() { ios::sync_with_stdio(false); cin.tie(0); int n, input; cin >> n; while (n--) { cin >> input; list[input]++; } for (int i = 1; i <= 10000; i++)for (int j = 0; j < list[i]; j++) { cout << i << '\n'; } return 0; } | cs |
반응형
'알고리즘 > 공부' 카테고리의 다른 글
[영상처리 스터디] Queue 구현을 조금 개선시키기 (0) | 2019.01.14 |
---|---|
[영상처리 스터디] Queue C로 구현하기 (2) | 2019.01.14 |
[SCCC 스터디] 힙 정렬 직접 구현 (0) | 2019.01.14 |
[SCCC 스터디] 3일차 정렬 (0) | 2019.01.13 |
[SCCC 스터디] 2 일차 구현+시간복잡도 (0) | 2019.01.13 |
Comments