신규 블로그를 만들었습니다!

2020년 이후부터는 아래 블로그에서 활동합니다.

댓글로 질문 주셔도 확인하기 어려울 수 있습니다.

>> https://bluemiv.tistory.com/

STL sort() 함수

정렬을 만들어서 사용할 수 는 있지만,

매번 만들어서 사용하기는 번거롭다.

 

이럴때, 'alforithm' 을 include해서 그안에 있는 sort() 함수를 사용하면 된다.

 

1. sort() 함수를 이용한 오름차순과 내림차순

#include <iostream>
#include <algorithm>
 
using namespace std;
 
bool desc(int a, int b){
    return a > b;
}
int main(void){
    // sort()를 사용하기 위해 algorithm을 include 한다.
    int data[10] = {9, 3, 5, 7, 8, 1, 2, 4, 6, 10}; 
    
    sort(data, data+10); // 배열과 마지막원소를 넣어준다.
    for(int i=0; i<10; i++){
        cout << data[i] << ' ';
    }
    cout << endl; 
    
    // greater 함수를 이용해서 내림차순으로 표현할 수 있다. 
    sort(data, data+10, desc); 
    for(int i=0; i<10; i++){
        cout << data[i] << ' ';
    }
    
    return 0;
}
​

 

sort(배열의 처음원소, 배열의 마지막 원소);

sort()는 기본적으로 오름차순으로 정렬을 해준다.

 

만약 내림차순으로 정렬을 하고 싶다면,

내림차순으로 해주는 함수를 정의하고 sort() 함수의 마지막 인자로 넣어주면 된다.

 

위의 코드를 보면

bool desc(int a, int b){
    return a > b;
}​

desc라는 임의의 함수를 만들었다.

int형 변수 2개를 비교해서, a>b의 결과를 반환한다.

 

sort(data, data+10, desc);​

위와 같이 마지막 원소로 내가 만든 함수를 넣어준다.

그러면, sort는 내림차순으로 정렬을 해준다.

 

반환값을 a<b로 한다면, 오름차순이 되겠지만

기본적으로 오름차순으로 정렬해주기 때문에, 굳이 할 필요가 없다.

 

 

 

2. sort()를 이용하여 학생점수 오름차순으로 나열하기

 
// 학생들을 점수가 낮은 학생부터 나열하기
#include <iostream>
#include <algorithm>
 
using namespace std;
 
class Student{
    public:
        string name;
        int score;
        
        //constructor
        Student(string name, int score){
            this->name = name;
            this->score = score;
        }
        
        // operator '<' overloading
        bool operator <(Student &student){
            return this->score < student.score;
        }
};
 
int main(void){
    Student students[] ={
        Student("모모", 99),
        Student("쯔위", 79),
        Student("미나", 80),
        Student("사나", 88),
        Student("나연", 92),
        Student("지효", 84),
        Student("다현", 97),
        Student("채영", 82),
        Student("정연", 90)
    };
    
    sort(students, students + 9);
    
    for(int i=0; i<9; i++){
        cout << students[i].name << " : " << students[i].score << endl;
    }
    
    return 0;
}

'Student'라는 class를 만들어서, 그안에 필드값으로 이름과 점수를 넣는다.

그리고, constructor를 설정하고

연산자 오버로딩을 통해 오름차순으로 정렬될 것을 정의한다.

// operator '<' overloading
bool operator <(Student &student){
    return this->score < student.score;
}​

 

sort(배열의 첫번째 원소, 배열의 마지막 원소);

위와 같이 인자를 받기 때문에,

sort(students, students+9); 로 작성한다.

 

출력을 해보자

 

반대로 내림차순으로 하고 싶다면,

// operator '<' overloading
bool operator <(Student &student){
    return this->score > student.score;
}​

보기는 안좋지만,

반환값에서 부호를 반대방향으로 바꿔주면 된다.

 

 

3. 클래스를 이용하지않고, pair를 이용해서 나열하기

 
#include <iostream>
#include <algorithm>
#include <vector>
 
using namespace std;
 
int main(void){
    // 클래스를 사용하지 않고 사용하는 방법
    // pair 라이브러리 사용
    vector<pair<int, string> > v; // int, string 으로 묶어서 사용 
    v.push_back(pair<int, string>(99, "모모"));
    v.push_back(pair<int, string>(79, "쯔위"));
    v.push_back(pair<int, string>(80, "미나"));
    v.push_back(pair<int, string>(88, "사나"));
    v.push_back(pair<int, string>(92, "나연"));
    v.push_back(pair<int, string>(84, "지효"));
    v.push_back(pair<int, string>(97, "다현"));
    v.push_back(pair<int, string>(82, "채영"));
    v.push_back(pair<int, string>(90, "정연"));
    
    sort(v.begin(), v.end());
    for(int i=0; i< v.size(); i++){
        cout << v[i].second << ':' << v[i].first << endl;
    } 
    return 0;
}

2번 예제에서는 class를 이용했지만,

class를 선언해서 사용하기 귀찮다면

vector, pair를 이용해서 나열할 수 있다.

 

 

 

4. pair를 이용하고, 생년월일, 점수를 고려해서 정렬하기

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

bool compare (pair<string, pair<int, int> > a,
                pair<string, pair<int, int> > b){
    if(a.second.first == b.second.first){
        // 점수가 동일할때는 생년월일이 느린사람(높은사람)순으로 정렬 
        return a.second.second > b.second.second;
    }else{
        // 점수 내림차순 
        return a.second.first > b.second.first;
    }
}
int main(void){
    vector<pair<string, pair<int, int> > > v;
    v.push_back(pair<string, pair<int, int> > ("아이린", make_pair(90, 19910329)));
    v.push_back(pair<string, pair<int, int> > ("예리", make_pair(98, 19990305)));
    v.push_back(pair<string, pair<int, int> > ("슬기", make_pair(92, 19940210)));
    v.push_back(pair<string, pair<int, int> > ("조이", make_pair(94, 19960903)));
    v.push_back(pair<string, pair<int, int> > ("웬디", make_pair(94, 19940221)));
    
    sort(v.begin(), v.end(), compare);
    for(int i=0; i<5; i++){
        cout << v[i].first << '(' << v[i].second.second;
        cout << "):" << v[i].second.first << endl;
    }
    return 0;
}​

점수를 내림차순으로 정렬한다.

점수가 동일한경우, 나이가 어린 학생부터 정렬한다.

 

 

 

정렬 알고리즘이 궁금하다면 아래 참조

 

관련 글

2018/04/28 - [Algorithm] - 자료구조 :: 선택정렬 Selection sort (c/c++ 구현)

2018/04/28 - [Algorithm] - 자료구조 :: 버블정렬 Bubble sort (c/c++ 구현)

2018/04/28 - [Algorithm] - 자료구조 :: 삽입정렬 Insertion sort (c/c++ 구현)

2018/04/28 - [Algorithm] - 자료구조 :: 퀵 정렬 Quick sort (c/c++ 구현)

2018/04/29 - [Algorithm] - 자료구조 :: 병합정렬 Merge sort (c/c++ 구현)

 

자료구조 :: 병합정렬 Merge sort (c/c++ 구현)

병합정렬 (Merge sort) 병합정렬도 분할정복을 이용하기 때문에 퀵 정렬과 똑같이 O(N*logN)이다. 퀵정렬과 다르게 피봇값이 없다. 항상 반으로 나누기 때문에 logN을 보장한다. 반으로 나눠서 나중에 합치면서 정..

hongku.tistory.com

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기