본문 바로가기
C++

[C++] - sort()함수 사용법 정리(STL)

by 개발 고양이 2024. 1. 2.

이전에 STL에 대해 설명했던 포스팅에서 알고리즘(algorithm)에 대하여 간단히 알아보았다. 

오늘은 알고리즘의 템플릿 함수들 중, 정렬 시 유용하게 사용할 수 있는 sort() 함수에 대하여 알아보자. 자료구조와 알고리즘을 배우기 시작하면 선택 정렬, 삽입 정렬, 퀵 정렬, 병합 정렬, 버블 정렬, 힙 정렬 등등 다양한 정렬 방법에 대하여 공부하게 된다. 하지만 C++의 STL에는 이미 간단한 코드 몇줄로 정렬을 수행할 수 있는 라이브러리가 구현되어 있다. 따라서 복잡하게 정렬 알고리즘을 구현할 필요가 없다. (참고로 sort()의 시간 복잡도는 nlogn 이다.)


sort() 사용법

sort함수는 배열의 원소들을 정렬할 때 사용하며, 기본적으로 오름차순으로 정렬한다. sort()함수를 사용하기 위해서는 <algorithm> 헤더파일을 include 시켜줘야 한다. 

 

sort(배열의 시작 주소배열의 마지막 주소+1) ;

 

위와 같은 양식으로 적어주면 된다.

예를 들어, 배열 A의 원소의 개수가 5개라면, sort(A, A+5); 와 같이 써주면 배열 A에 들어있는 5개의 원소가 자동으로 정렬된다. 

아래에 예시 코드를 적어놓았다. 

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

int main() {
    int arr[5] = { 3, 1, 2, 5, 4 };

    for (int i = 0; i < 5; i++) {
        cout << arr[i] << " ";
    }

    cout << "\n\n=====asc sort======\n";
    sort(arr, arr + 5); //기본값은 오름차순!

    for (int i = 0; i < 5; i++) {
        cout << arr[i] << " ";
    }
}

실행 결과, 배열이 오름차순으로 정렬된 것을 확인할 수 있다.

 

 


내림차순으로 정렬하기

그렇다면 오름차순이 아닌 내림차순으로 정렬할 수 있는 방법은 없을까?

내림차순을 위한 메소드 하나를 선언하고, sort함수 내에서 해당 메소드를 호출해주면 된다. 

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

위 메소드를 선언해주고,

 

sort(배열의 시작 주소,  배열의 마지막 주소+1,  desc) ;

 

이렇게 sort()내에서 호출해주면, 왼쪽의 요소가 오른쪽의 요소보다 더 클 수 있도록 정렬되면서 결과적으로 내림차순으로 정렬된다. 

이를 참고하여 위의 오름차순 예시코드를 내림차순 버전으로 바꾸면 아래와 같다. 

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


//내림차순으로 정렬하기
bool desc(int a, int b) {
    return a > b;
}

int main() {
    int arr[5] = { 3, 1, 2, 5, 4 };

    for (int i = 0; i < 5; i++) {
        cout << arr[i] << " ";
    }

    cout << "\n\n=====desc sort======\n";
    sort(arr, arr + 5, desc); //기본값은 오름차순!

    for (int i = 0; i < 5; i++) {
        cout << arr[i] << " ";
    }
}

desc메소드 선언 후 sort함수에서 호출한 결과 배열이 내림차순으로 정렬된 것을 확인할 수 있다.

 


심화) 기준을 두고 구조체 정렬하기

앞서 설명한 기본적인 오름차순, 내림차순 단순 정렬에서 나아가, 특정한 기준을 가지고 정렬해야 할 때에는 어떻게 해야하는지 알아보자. 

 

알파벳등급과 점수를 묶은 구조체를 정렬해보자. 단, 이때 알파벳 등급이 같을 경우 점수가 더 높은 원소를 우선으로 하여 정렬해야한다고 하자.

(예를 들어 같은 A등급은 B등급보다 우선이지만, 같은 A등급일 경우 95점이 90점보다 우선이어야 한다.)

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

struct Grade {
    string grade;
    int score;
};

bool compare(Grade a, Grade b) {
    if (a.grade == b.grade) {   //grade가 같으면
        return a.score > b.score;    //score이 더 높은 것을 앞쪽으로 정렬 (score은 내림차순으로)
    }
    return a.grade < b.grade;   //grade는 오름차순
}

int main() {
    Grade g[5] = { {"B",80}, {"C", 71}, {"B", 85}, {"A", 90}, {"A", 95} };

    for (int i = 0; i < 5; i++) {
        cout << g[i].grade << " " << g[i].score << "\n";
    }

    cout << "\n\n=====asc sort======\n";
    sort(g, g + 5, compare); //기본값은 오름차순!

    for (int i = 0; i < 5; i++) {
        cout << g[i].grade << " " << g[i].score << "\n";
    }

    cout << "\n\n";
}

알파벳 등급을 오름차순으로 정렬하되, 등급이 같을 경우 점수를 기준으로 하여 내림차순으로 정렬되었다.