본문 바로가기
Algorithm/이론

[STL] sort 사용하기

by 우툴 2016. 4. 5.
728x90

sort 사용하기

 sort는 말 그대로 정렬을 시켜주는 것이다. 가장 큰 장점은 그 상황에 맞는 가장 적절한 방법으로 정렬을 시켜주기 때문에 효율적이라고 합니다.sort의 몇가지 특징을 써보자면

 1. #include <algorithm> 에 포함되어 있습니다.

 2. 정렬 설정을 하는 여러 방법이 있습니다. 디폴트 값은 오름 차순입니다.

 3. 정렬을 하는 방법으로는 연산자 오버로딩과 비교함수를 만드는 경우등이 있습니다.

 4. 비교함수를 만들때 주의점은 const 를 사용해야하고 & 연산자를 사용해야 합니다 왜냐하면 비교를 하는 과정에서는 값의 수정이나 변경이 없다라고 가정하고 단순 비교만 하기 때문입니다.

비교함수를 사용하여서 sort 사용하기

 <단순 비교 함수>

1
2
3
4
5
6
7
//----------------------------------------
//            내림차순을 위한 비교함수
//----------------------------------------
bool cmp(const int &u, const int &v) {
        return u > v;
}
 
cs

 비교함수를 사용하면 좀 더 다양한 방법으로의 정렬이 가능합니다. 위의 코드는 단순이 내림차순의 정렬을 가능하게 합니다. 여기서 중요한 것은 앞에있는 u와 v의 관계인데 간략히 설명하자면 u 다음에 나오는게 v 라고 생각하는게 쉽게 이해할수 있습니다. 즉 여기서 return 값이 true면 바꾸고 false면 그대로 가는 것입니다. 그래서 위의 코드로 설명하자면 u 다음에 v가 나오는데 u > v 가 크다면 둘이 바꿔라 입니다. 즉 큰수를 먼저 나오게 해라라고도 판단하면 됩니다. 

<구조체 비교 함수>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
//-----------------------------------------
//    구조체를 위한 비교 함수
//-----------------------------------------
struct Point {
    int x, y;
};
 
bool cmp(const Point &u, const Point &v) {
    if (u.x < v.x) {
        return true;
    }
    else if (u.x == v.x) {
        return u.y < v.y;
    }
    else {
        return false;
    }
}
cs

 위의 비교함수는 구조체인 point의 비교함수를 위한 정렬방법으로 일단 x를 오름차순으로 정렬하고 그 후에 만약 x가 같다면 y를 오름차순으로 정렬하라는 코드입니다.

 코드

 단순한 비교함수와 구조체를 이용한 비교함수를 코드로 구성해 보았습니다.

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
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <stdio.h>
#include <algorithm>
 
using namespace std;
 
 
 
 
//-----------------------------------------
//    일반 비교 함수
//-----------------------------------------
bool cmp(const int &u, const int &v) {
    return u > v;
}
 
//-----------------------------------------
//    구조체를 위한 비교 함수
//-----------------------------------------
struct Point {
    int x, y;
};
 
bool cmpPoint(const Point &u, const Point &v) {
    if (u.x < v.x) {
        return true;
    }
    else if (u.x == v.x) {
        return u.y < v.y;
    }
    else {
        return false;
    }
}
 
int main(void){
 
    //-----------------------------------------
    //    단순 오름차순 정렬
    //-----------------------------------------
 
    int a[5= { 53214 };
    
    sort(a, a + 5);
    //-----------------------------------------
    //    비교 함수를 사용한 정렬
    //-----------------------------------------
    sort(a, a + 5,cmp);
 
    //-----------------------------------------
    //    구조체 비교함수를 사용한 정렬
    //-----------------------------------------
    Point C[5];
 
    for (int i = 0; i < 5; i++)
    {
        Point temp;
        temp.x = i % 3; temp.y = (i + 1) % 4;
        C[i] = temp;
    }
    sort(C, C + 5, cmpPoint);
 
 
    return 0;
}
cs


728x90

'Algorithm > 이론' 카테고리의 다른 글

[알고리즘] 이분 탐색  (0) 2016.04.06
[STL] vector 사용하기  (0) 2016.04.04
[STL] pair 사용하기  (1) 2016.04.04
[조합] nCr 쉽게 구하기. (수정 20190604)  (5) 2016.04.03
[그래프의 표현] 인접 리스트  (0) 2016.04.01

댓글