https://youtu.be/59fZkZO0Bo4?si=L7IS5zTnwv4BWlLV
재귀적으로 정렬하는 함수
void merge(int st, int en) {
int mid = (st + en) / 2;
int lidx = st, ridx = mid;
for (int i = st; i < en; ++i) {
if (ridx == en) tmp[i] = arr[lidx++];
else if (lidx == mid) tmp[i] = arr[ridx++];
else if (arr[lidx] <= arr[ridx]) tmp[i] = arr[lidx++];
else tmp[i] = arr[ridx++];
}
for (int i = st; i < en; ++i) arr[i] = tmp[i];
}
void merge_sort(int st, int en) {
int mid = (st + en) / 2;
if (en == st + 1) return;
merge_sort(st, mid);
merge_sort(mid, en);
merge(st, en);
}
얻어갈 것: a[aidx] < b[bidx]
말고 else if (a[aidx] <= b[bidx]) c[i] = a[aidx++];
여야 stable sort 성질을 만족함. 두 개의 크기가 같을 때 a의 원소가 앞쪽에 들어가는 것.
보통
최악의 경우 --> 최대 단점~~~ 직접 구현할 땐 quick sort 피해야 하는 이유!
quick sort는 in-place sort. 추가 공간이 필요 없다!
을 보장하기 위해 STL에선 introspective sort로 quick sort를 구현해 놓음. https://choiseokwon.tistory.com/209
https://github.com/encrypted-def/basic-algo-lecture/blob/master/workbook/0x0E.md
완죤 간단한 정렬 문제. bubble sort, merge sort 연습해보기
시간제한과 메모리제한을 살펴보면~~ 시간은 넉넉한데 메모리가 부족하다. 그럼 메모리를 줄일 방법을 생각해야 함.
입력받는 수의 범위가 10,000보다 작거나 같은 자연수
이고 입력받는 수의 개수의 범위는 N(1 ≤ N ≤ 10,000,000)
이기 때문에 int arr[10001]
을 선언하고 입력받은 수를 인덱스로 가지는 배열값을 늘려가면서 저장해준다.
#include <iostream>
using namespace std;
int N, num;
int arr[10001];
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N;
for (int i = 0; i < N; ++i) {
cin >> num;
++arr[num];
}
for (int i = 1; i <= 10000; ++i) {
while (arr[i]--) {
cout << i << '\n';
}
}
}
그냥 내림차순만 바뀐 거~ 간단한 정렬문제
10989처럼 해주면 됐던 문제
스테이블 소트가 필요하니까 머지소트로 풀어주기~
답지에서 사용된 stable_sort 사용법이랑 람다함수 사용법 익히기!
얻어갈 것: STL의 stable_sort, lambda 함수
https://cplusplus.com/reference/algorithm/stable_sort/?kw=stable_sort
https://modoocode.com/196
완전 바보 첨엔 stable_sort로 y기준 정렬 하고 x기준 정렬해줬다
근데 그냥 pair<int x, int y> arr를 sort() 함수 사용해서 정렬해주면 됐다.
x좌표가 증가하는 순으로, x좌표가 같으면 y좌표가 증가하는 순서로 정렬
이니까
stable sort도 필요없고! 입력받은 순서랑 상관 없으니까
11650 풀었으니까 이지피지 그냥 x를 second에 받고 y를 first에 받아주고 sort()하면 된다.