이전에 STL에 대해 설명했던 포스팅에서 알고리즘(algorithm)에 대하여 간단히 알아보았다.
오늘은 알고리즘의 템플릿 함수들 중, 정렬 시 유용하게 사용할 수 있는 sort() 함수에 대하여 알아보자. 자료구조와 알고리즘을 배우기 시작하면 선택 정렬, 삽입 정렬, 퀵 정렬, 병합 정렬, 버블 정렬, 힙 정렬 등등 다양한 정렬 방법에 대하여 공부하게 된다. 하지만 C++의 STL에는 이미 간단한 코드 몇줄로 정렬을 수행할 수 있는 라이브러리가 구현되어 있다. 따라서 복잡하게 정렬 알고리즘을 구현할 필요가 없다. (참고로 sort()의 시간 복잡도는 nlogn 이다.)
sort() 사용법
sort함수는 배열의 원소들을 정렬할 때 사용하며, 기본적으로 오름차순으로 정렬한다. sort()함수를 사용하기 위해서는 <algorithm> 헤더파일을 include 시켜줘야 한다.
sort(배열의 시작 주소, 배열의 마지막 주소+1) ;
위와 같은 양식으로 적어주면 된다.
예를 들어, 배열 A의 원소의 개수가 5개라면, sort(A, A+5); 와 같이 써주면 배열 A에 들어있는 5개의 원소가 자동으로 정렬된다.
아래에 예시 코드를 적어놓았다.
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int arr[5] = { 3, 1, 2, 5, 4 };
for (int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}
cout << "\n\n=====asc sort======\n";
sort(arr, arr + 5); //기본값은 오름차순!
for (int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}
}
내림차순으로 정렬하기
그렇다면 오름차순이 아닌 내림차순으로 정렬할 수 있는 방법은 없을까?
내림차순을 위한 메소드 하나를 선언하고, sort함수 내에서 해당 메소드를 호출해주면 된다.
bool desc (int a, int b){
return a > b;
}
위 메소드를 선언해주고,
sort(배열의 시작 주소, 배열의 마지막 주소+1, desc) ;
이렇게 sort()내에서 호출해주면, 왼쪽의 요소가 오른쪽의 요소보다 더 클 수 있도록 정렬되면서 결과적으로 내림차순으로 정렬된다.
이를 참고하여 위의 오름차순 예시코드를 내림차순 버전으로 바꾸면 아래와 같다.
#include <iostream>
#include <algorithm>
using namespace std;
//내림차순으로 정렬하기
bool desc(int a, int b) {
return a > b;
}
int main() {
int arr[5] = { 3, 1, 2, 5, 4 };
for (int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}
cout << "\n\n=====desc sort======\n";
sort(arr, arr + 5, desc); //기본값은 오름차순!
for (int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}
}
심화) 기준을 두고 구조체 정렬하기
앞서 설명한 기본적인 오름차순, 내림차순 단순 정렬에서 나아가, 특정한 기준을 가지고 정렬해야 할 때에는 어떻게 해야하는지 알아보자.
알파벳등급과 점수를 묶은 구조체를 정렬해보자. 단, 이때 알파벳 등급이 같을 경우 점수가 더 높은 원소를 우선으로 하여 정렬해야한다고 하자.
(예를 들어 같은 A등급은 B등급보다 우선이지만, 같은 A등급일 경우 95점이 90점보다 우선이어야 한다.)
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
struct Grade {
string grade;
int score;
};
bool compare(Grade a, Grade b) {
if (a.grade == b.grade) { //grade가 같으면
return a.score > b.score; //score이 더 높은 것을 앞쪽으로 정렬 (score은 내림차순으로)
}
return a.grade < b.grade; //grade는 오름차순
}
int main() {
Grade g[5] = { {"B",80}, {"C", 71}, {"B", 85}, {"A", 90}, {"A", 95} };
for (int i = 0; i < 5; i++) {
cout << g[i].grade << " " << g[i].score << "\n";
}
cout << "\n\n=====asc sort======\n";
sort(g, g + 5, compare); //기본값은 오름차순!
for (int i = 0; i < 5; i++) {
cout << g[i].grade << " " << g[i].score << "\n";
}
cout << "\n\n";
}
'C++' 카테고리의 다른 글
[C++] - vector를 2차원으로 사용하기 (STL) (1) | 2024.01.08 |
---|---|
[C++] - vector 사용법 정리 (STL) (1) | 2024.01.06 |
[C++] - map 사용법 정리 (STL) (1) | 2023.12.30 |
[C++] - STL(표준 템플릿 라이브러리)에 대하여 (1) | 2023.12.28 |
[C/C++] - 입력 개수를 모를때 (EOF까지 입력받기) (0) | 2023.12.13 |