잡다한 지식
sort 함수 사용법
컴영
2020. 3. 25. 13:53
Algorithm 헤더에 있는 sort 함수에 관하여 정리해보도록 하자.
sort(배열의 시작점 주소, 배열의 마지막점 주소)
- 개념 : sort(start, end) , start와 end 범위에 있는 요소들을 오름차순 정렬해주는 함수
퀵 정렬을 기준으로 함수가 구현되어 있어서, 시간 복잡도는 O(nlogn)이다.
- 사용법
크기가 n인 배열 arr, 백터 vec이 있다고 할때
- sort(arr, arr +n);
- sort(vec.begin(), vec.end());
- sort(vec.begin(), vec.end(), cmp); → 비교함수 cmp를 만드는 경우
- sort(vec.begin(), vec.end(), greater<자료형>()); → 내림차순 정렬을 사용하는 경우
greater : 첫번째 인자가 두번째 인자보다 크면 true 반환 (bool) → #include <functional> 추가해야 greater STL 사용가능
비교함수 만드는 경우를 자세히 살펴보자.
vector에 인자가 1개면 만들 필요없지만, 인자가 구조체인 경우 혹은 내림 차순을 greater<>() 사용 안할때
비교함수를 만들어 줘야한다.
주의할 점은 const와 & 연산자를 사용해야 한다는 점이다.
(비교하는 과정에서 값의 수정이나 변경이 없으므로)
코드를 통해 보자.
1. 내림차순 정렬
1 2 3 4 5 6 7 8 9 10 | //내림차순 정렬 bool cmp(const int &a, const int &b) { return a > b; } //다른 식으로 쓴다면? bool cmp(const int &a, const int &b) { if(a > b) return true; else return false; } | cs |
2. 인자가 구조체인 경우
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 | struct Point { int x, y; }; //x를 오름차순으로 정렬하고,x가 같다면 y도 오름차순으로 정렬 bool cmp(const Point &a, const Point &b) { if (a.x < b.x) { return true; } else if (a.x == b.x) { return a.y < b.y; } else { return false; } } //다른식으로 표현하자면 bool cmp(const Point &a, const Point &b) { if (a.x == b.x) { return a.y < b.y; } else{ return a.x < b.x; } } | cs |