안녕하세요 기린입니다 :)
지금까지 선택 정렬, 버블 정렬, 삽입 정렬, 퀵 정렬, 병합 정렬의 개념을 이해하고 간단한 예시를 통해 프로그램까지 작성하는 시간을 가졌습니다. 자 이번엔 C++ STL sort 함수에 대해 알아 보도록 하겠습니다. 정렬은 컴퓨터 공학의 오래된 연구 분야이므로 아주 훌륭한 정렬 라이브러리들이 존재하죠. 즉, 앞서 직접 코딩했던것 처럼 할 필요 없이 라이브러리를 가져다 쓰면 되는 것입니다.
그치만 기본적인 정렬 원리에 대해서는 잘 알고있어야 문제해결능력에 도움이 될거라 생각합니다.
이제 sort 함수의 사용법을 소스코드로 보시겠습니다
#include <iostream>
#include <algorithm>
using namespace std;
int main(void) {
// 입력
int a[10] = {2, 3, 10, 4, 8, 5, 1, 6, 7, 9};
// 정렬
sort(a, a + 10);
// 출력
for (int i = 0; i < 10; i++) {
cout << a[i] << ' ';
}
}
기본적으로 sort 함수는 C++ algorithm 헤더에 포험되어 있고, 기본 사용법은 위와 같습니다.
이제 우리는 C++ 문법으로 코딩해보겠니다 :] C++ 은 C와 굉장히 흡사한 구조를 가지고 있고, C에 객체 지향 프로그래밍 기법을 더한 문법이라고 보시면 됩니다.
sort 라는 함수는 기본적으로 오름차순 정렬을 수행하는데요 파라미터 값으로는
sort(a, a + 10);
위와 같이 배열 a 과 함께 배열의 시작점 주소와 마지막 주소 + 1을 더해서 적으면 됩니다. 총 10개의 원소가 있는 배열의 a를 정렬해 주는것이죠
#include <iostream>
#include <algorithm>
using namespace std;
// 오름차순 조건 함
bool compare(int a, int b) {
return a < b;
// 내림차순
// return a > b;
}
int main(void) {
// 입력
int a[10] = {2, 3, 10, 4, 8, 5, 1, 6, 7, 9};
// 정렬
sort(a, a + 10, compare);
// 출력
for (int i = 0; i < 10; i++) {
cout << a[i] << ' ';
}
}
sort 함수의 장점으로 정렬의 기준을 직접 설정할 수 있다는 점인데요 위와 같이 compare 함수를 만들어 sort 함수의 세 번째 파라미터 값으로 넣으면, 해당 함수의 반환 값에 맞게 정렬을 수행합니다. sort는 기본적으로 오름차순으로 정렬하기 때문에 copare 함수에서 주석처리된 부분으로 반환한다면 내림차순의 결과를 얻을 수 있습니다.
return a > b 에서 관계연산자 > 의 의미는 왼쪽에 있는 것이 더 클 수 있도록 정렬 하겠다는 기준을 만들어주는 것이죠 :)
위와 같이 단순 데이터 정렬 기법은 실무에서 사용할일이 많지 않을거라고 생각합니다. 실무에서는 프로그래밍을 할 때는 모든 데이터들이 객체러 정리되어 내부적으로 여러 개의 변수를 포함하고 있기 때문인데요. 보통 객체의 정렬 방식은 '특정한 변수를 기준으로' 정렬하기 때문에 꼭 알고가시는게 좋을것 같네요 :]
#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 <(Student &student) {
return this->score < student.score;
}
};
int main(void) {
Student students[] = {
Student("현빈", 90),
Student("원빈", 93),
Student("김우빈", 97),
Student("권상우", 87),
Student("나야나", 92)
};
sort(students, students + 5);
// 출력
for (int i = 0; i < 5; i++) {
cout << students[i].name << ' ';
}
}
위 소스코드는 점수 (score)를 기준으로 학생을 정렬해서 학생들의 이름을 출력하는 프로그램입니다. 이를 퀵 정렬, 병합 정렬 등의 함수 안에서 구현하고자 하면 굉장히 복잡할 수 있지만, 클래스와 sort 함수를 이용하여 구현하면 보다 쉽게 작업하실 수 있습니다.
sort 함수 사용에 있어 일반 데이터의 정렬과 다른점이 있다면 객체를 선언할 때 operator 즉 정렬 기준을 같이 선언하여 sort 함수를 사용할 때 별도 비교함수를 넣을 필요가 없다는 점 입니다.
여기까지 이해되시나요 ?
다음 포스팅에 이어서 진행해볼게요 !
즐거운 코딩하세요 :)
문의: ralla0405@gmail.com