🖥️ CS/Data Structure & Algorithm

#include<algorithm> 그리고 sort() - (1)

한국의 메타몽 2020. 3. 5. 02:11

https://www.youtube.com/watch?v=YJ-OUnZu7nQ

공부 출처 링크 : 동빈나 유튜버 

정렬을 할 때 사용될 수 있는 기법은 다양하다.

선태정렬, 삽입정렬, 버블정렬, 병합정렬, 힙정렬. 당장 떠올릴 수 있는 기법만 해도 5가지이다.

 

하지만 매번 정렬을 정의해주는 것은 번거로울뿐더러, 구현 과정에서 실수의 여지도 있다. 

C++에서는 STL를 통해 오름차순 or 내림차순을 정렬할 수 있는 함수가 이미 구현되어있으므로, 해당 함수를 사용하면 굉장히 편리하다. 

 

오름차순 구현
결과

#include <algorithm>과 sort(정렬의 시작, 정렬의 끝)만 추가하면 기본적인 정렬이 완성된다. 

기억해야할 점은 두 가지이다. 

 

  1. sort(arr, arr+T)에서 T의 의미는 배열의 주소라기 보다는 배열이 가진 원소의 갯수라고 해석하면 편하다. 
  2. 연산자를 따로 오버로딩하지 않으면 오름차순으로 정렬된다. 

Defalut 정렬이 오름차순일까? 

찾아보니 하단과 같은 답을 발견하였다. 

"The elements are compared using operator < for the first version"에 집중하자.

만약 내림차순으로 정렬하고 싶으면 어떻게할까? 

그럴땐 연산자를 오버로딩 하면 된다.

 

desc 함수를 구현하여 연산자 오버로딩
내림차순 결과

하지만 이러한 기본 로직은 프로그래밍 대회에서나 활용할 수 있고, 

실전에서는 객체를 이용해서 사용한다. 

객체를 사용해서 구현한 예시는 하단과 같다. 

 

#include <iostream>
#include <algorithm>
using namespace std;

class Student{
public:
    string name;
    int score;
    
    Student(string name, int score){
        this->name = name;
        this->score = score;
    }
    bool operator <(const Student &student) const{
        return this->score < student.score;
    }
};

int main(void){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
  
    Student students[] = {
        Student("AA", 99),
        Student("BB", 100),
        Student("CC", 95),
        Student("DD", 97),
    };
    
    sort(students,students+4);
    
    for(int i=0; i<4; i++)
        cout << students[i].name << " : " << students[i].score << "\n";
    
    return 0;
}

결과값

만약 오름차순이 아닌 '내림차순'으로 변경하고 싶으면,

상단의 operator함수에서 '<'를 '>'로 변경해주면 된다.