STL sort() 함수
특징
- 2개 혹은 3개의 argument를 필요로 하는데, 첫 번째 두 개의 argument는 iterator로서 정렬하는 범위를 나타낸다. sort(start, end)
- 퀵 정렬을 기반으로 함수가 구현되어 있다. 평균 시간 복잡도 : O(NlogN)
- 세 번째 argument를 넣지 않으면 default로 오름차순 정렬이 수행된다.
- 사용자 정의 함수를 만들어 세 번째 인자로 넣어 정렬 기준을 정의할 수 있다.
- 기본적으로 두 개의 객체를 비교해서 첫 번째가 두 번째보다 작으면 true, 아니면 false를 반환한다.
예제
- default - 오름차순 정렬
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using namespace std;
void printArray(int a[], int n) // 배열 출력 함수
{
for (int i = 0; i < n; i++)
cout << a[i] << " ";
cout << endl;
}
int main(void)
{
int arr[10] = { 9, 1, 3, 2, 5, 4, 8, 6, 10, 7 };
sort(arr, arr + 10);
printArray(arr, 10);
}출력
- 내림차순 정렬
내림차순 정렬은 세 번째 인자로 함수를 정의하여 사용할 수도 있고,헤더파일에 선언되어 있는 greater<자료형>() 을 전달하여 내림차순으로 정렬을 수행할 수 있다.
(less<자료형>()은 오름차순 정렬을 해주지만 default와 동일하므로 생략한다.)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
using namespace std;
void printArray(vector<int> &a, int n) // 배열 출력 함수
{
for (int i = 0; i < n; i++)
cout << a[i] << " ";
cout << endl;
}
bool desc(int a, int b) // 내림차순 정렬을 수행할 비교 함수
{
return a > b;
}
int main(void)
{
srand((int)time(NULL)); // 시드 값 설정
vector<int> vec;
int vsize = 10;
for (int i = 0; i < vsize; i++)
vec.push_back(rand() % 10 + 1); // 벡터에 1 ~ 10의 난수 삽입
// N ~ (M+N-1) 까지 난수 생성 : rand() % M + N
printArray(vec, vsize);
sort(vec.begin(), vec.end(), greater<int>()); // [vec.begin(), vec.end()) 내림차순 정렬
// greater<int>() 대신 desc를 넣어도 같은 결과
cout << endl;
printArray(vec, vsize);
}출력
- 기준을 지정하여 정렬 - compare함수
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
using namespace std;
class Student
{
public:
string name;
int age;
int score;
Student(string name, int age, int score)
{
this->name = name;
this->age = age;
this->score = score;
}
};
void printStudent(vector<Student> &vec, int n) // 출력 함수
{
for (int i = 0; i < n; i++)
cout << "[ 이름 : " << vec[i].name << ", 나이 : " << vec[i].age << ", 점수 : " << vec[i].score << " ]" << endl;
cout << endl;
}
bool compare(Student a, Student b) // 내림차순 정렬을 수행할 비교 함수
{
if (a.score == b.score) // 점수가 같으면 -> 나이가 적은 순
return a.age < b.age;
else // 점수가 다르면 -> 점수 높은 순(내림차순)
return a.score > b.score;
}
int main(void)
{
vector<Student> vec;
int vsize = 5;
vec.push_back(Student("kwon", 25, 100));
vec.push_back(Student("kim", 24, 88));
vec.push_back(Student("shin", 29, 97));
vec.push_back(Student("jung", 27, 75));
vec.push_back(Student("park", 22, 88)); // 점수가 같으면 나이가 적은 순
printStudent(vec, vsize);
sort(vec.begin(), vec.end(), compare);
cout << endl;
printStudent(vec, vsize);
}출력
- 연산자 오버로딩을 통한 정렬(operator overloading)
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
using namespace std;
class Student
{
public:
string name;
int age;
int score;
Student(string name, int age, int score)
{
this->name = name;
this->age = age;
this->score = score;
}
// 연산자 오버로딩 '<' (클래스 내부)
bool operator <(Student& student)
{
return this->age < student.age; // 나이 오름차순으로 정렬
}
};
void printStudent(vector<Student>& vec, int n) // 출력 함수
{
for (int i = 0; i < n; i++)
cout << "[ 이름 : " << vec[i].name << ", 나이 : " << vec[i].age << ", 점수 : " << vec[i].score << " ]" << endl;
cout << endl;
}
int main(void)
{
vector<Student> vec;
int vsize = 5;
vec.push_back(Student("kwon", 25, 100));
vec.push_back(Student("kim", 24, 88));
vec.push_back(Student("shin", 29, 97));
vec.push_back(Student("jung", 27, 75));
vec.push_back(Student("park", 22, 88));
printStudent(vec, vsize);
sort(vec.begin(), vec.end());
cout << endl;
printStudent(vec, vsize);
}
출력
참조
https://www.acmicpc.net/blog/view/22
https://hongku.tistory.com/153
https://blockdmask.tistory.com/178