데이터를 다루다 보면 데이터를 정렬을 해야할 필요가 있는데 c++에서는 기본적으로 sort함수를 제공을 하고 있다.
오늘은 이러한 sort를 사용하는 방법에 대해서 정리를 해봤다.
1) sort algorithm
sort 알고리즘은 퀵 정렬을 기반으로 함수가 구현이 되어있다. 기본적으로는 시작과 끝 범위에 있는 인자들을 오름차순으로 정렬을 해주는 함수이다. 퀵 정렬을 기반으로 하기 때문에 평균적인 시간 복잡도는 n log n이다.
sort 함수는 <algorithm> 헤더파일에 속해있기 때문에 include를 해주어야 한다.
sort(T start, T end, Compare comp);
위에서 말한 것처럼 기본적으로 sort는 시작과 끝을 받아서 정렬을 해주는데 이때 세번째의 값으로 어떻게 비교할지에 대한 기준을 정해줌으로써 오름차순으로 할지 아님 내림차순으로 할지 결정을 해줄 수 있다.
기본적으로는 오름차순이 default이기 때문에 따로 지정을 하지 않을 경우에는 오름차순으로 정렬이 된다.
2) 배열 sort 사용법
int arr[5] = {1, 5, 3, 2, 4};
sort(arr,arr+5);
위와 같은 배열이 있을 때 sort를 하기 위해서는 시작 값에 arr을 넣어줌으로 써 배열의 시작 주소값을 넣어주고 기본적으로 sort는 마지막을 포함시키지 않기 때문에 arr+5를 함으로써 처음 값부터 5번째 값까지 정렬을 해서 오름차순으로 값을 반환해준다.
3) Vector sort 사용법
c++에서는 vector도 많이 사용을 하기 때문에 vector의 정렬의 방법에 대해서도 작성을 해보았다.
이미 v라는 vector에 값을 넣었다는 가정하에
sort(v.begin(),v.end());
이런식으로 함수를 사용하게 되면 vector안에 있는 값들이 자동적으로 오름차순으로 정렬이 되게 된다.
이처럼 값의 시작점과 끝의 범위를 알고 있으면 그 범위 사이의 값을 정렬을 진행할 수 있다.
4) 정렬 조건 변경
세번째 인자값을 통해서 정렬의 조건을 바꿀 수 있는데 기본적으로는 오름차순을 default로 설정이 되어 정렬이 된다.
sort(arr,arr+5,greater<int>());
그렇지만 세번째 인자에 greater<자료형>()을 넣어주게 되면 정렬을 할 때 내림차순으로 정렬을 하게 된다.
오름차순으로 정렬을 하고 싶을 때는 less<자료형>()을 넣어줘도 된다. 다만 기본형이 오름차순임으로 굳이 넣어줄 필요는 없다.
만약 비교해야 하는 것이 단순한 기준이 아닌 사용자의 기준으로 할 경우에는 bool 함수를 통해서 기준을 만들어서 넣어주면 된다.
struct People
{
string name;
int age;
};
bool compare(People a, People b)
{
if(a.name == b.name)
return a.age > b.age;
else
return a.name < b.name;
}
만약 사용자가 구조체를 만들고 이름이 같을 경우에는 나이를 비교를 하고 아닐 경우에는 이름의 사전 순서대로 정렬을 한다는 조건을 걸고 싶을 때는 위의 함수처럼 사용자가 직접 함수를 작성한 뒤에
sort(v.begin(),v.end(),compare);
이런식으로 함수의 이름을 세번째 인자에 넣어주면 된다.