클래스 객체를 이용해서 정렬하는 건 실무에서 많이 사용되는 방법이고 프로그래밍 대회에선 실행 시간에 안 좋은 측면 때문에 자주 사용되지 않는다고 합니다. 실제로는 C++에 vector 라이브러리에, pair 를 더 많이 이용합니다. 정렬은 이미 만들어진 훌륭한 라이브러리가 많으니깐 원리를 이해하고 바로 라이브러리를 사용하면 좋겠죠!
sort 함수는 <algorithm> 라이브러리에 포함되어있고 pair는 <vector> 라이브러리에 포함되어 있습니다.
#include <iostream>
#include <algorithm>
using namespace std;
//sort 기준을 스스로 정할 수 있음
//단순 데이터 정렬 기법은 현실적이지 않음
bool compare(int a,int b){
return a < b;
}
int main(void){
int a[10] = {9, 3, 5, 4, 1 ,10, 8, 6, 7, 2};
sort(a, a + 10, compare); // 배열과 정렬할 원소 개수
for(int i = 0; i < 10; i++){
cout<<a[i]<<' ';
}
}
sort()함수에 기본적인 사용방법입니다.
sort(배열, 어디까지 정렬을 어디까지 진행할것인지, 옵션(비교연산함수))
STL에 좋은 점은 정렬 기준을 스스로 정할 수 있다는 점입니다. 위에 compare 함수 처럼 말입니다. 이 함수에 반환 값에 맞게 정렬이 됩니다. < 를 > 로 하면 내림차순 정렬이 됩니다. (더 다양한 정렬 방식을 이용할 수 있겠죠?) 지정하지 않음녀 오름차순 기본 정렬이 됩니다.
데이터를 묶어서 클래스화 한 후 정렬하는 방식
실제로는 학생의 특성(학번,성별, 생년월일, 성적 등등등) 과 같이 묶어서 활용할 때가 많습니다. 객체지향적인거죠.
#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("박현청",99),
Student("이다인",93),
Student("박현강",80),
Student("박현은",100),
Student("보 라",85),
};
sort(students,students + 5);
for(int i = 0 ;i < 5; i++)
cout<<students[i].name<<endl;
}
< 를 오버라이딩합니다.
하지만 앞에서 미리 언급했듯이 프로그래밍적으로 봤을때 이렇게 묶어서 데이터를 표현하는 건 느립니다. 그래서 vector 를 쓰죠.
//실제 대회에서 문제 하나를 풀기 위해 클래스를 정의하고 있는 것은 적절치 않음
//실무에선 많이 씀
//대회에선 페어(Pair) 라이브러리를 사용함
#include <iostream>
#include <vector> //단순배열, 연결리스트 기반 vector
#include <algorithm>
using namespace std;
int main(void){
vector<pair<int , string> > v;
v.push_back(pair<int ,string>(90,"박현청"));
v.push_back(pair<int ,string>(65,"박현강"));
v.push_back(pair<int ,string>(87,"박현은"));
v.push_back(pair<int ,string>(88,"유제광"));
v.push_back(pair<int ,string>(60,"박영수"));
sort(v.begin(),v.end());
for(int i = 0; i < v.size();i++){
cout<< v[i].second << ' ';
}
}
push_back 으로 pair를 넣고 size() 배열의 크기를 확인합니다. pair에서 first 는 앞에 원소 second는 뒤에 원소입니다.
기준이 두개여도 정렬이 가능합니다. 이중 pair 를 사용하면 되는데요.
//2개의 기준을 이용해서 정렬
#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> >("박현청",pair<int,int>(90,19990430)));
v.push_back(pair<string, pair<int, int> >("박현강",pair<int,int>(90,19970217)));
v.push_back(pair<string, pair<int, int> >("박현은",pair<int,int>(80,19940803)));
v.push_back(pair<string, pair<int, int> >("유제광",pair<int,int>(100,19620217)));
v.push_back(pair<string, pair<int, int> >("박영수",pair<int,int>(60,19621020)));
sort(v.begin(),v.end(),compare);
for(int i = 0; i < v.size();i++){
cout<< v[i].first << ' ';
}
}
compare는 점수가 같을때는 생년월일이 빠르면 우선순위를 부여한다는 내용의 함수입니다.
이렇게 C++ STL의 sort() 함수를 살펴봤습니다. 이 내용은 유튜브의 나동빈님 강의와 블로그를 보며 복습한 내용입니다. ! 감사합니다.
나동빈님 유튜브입니다!
https://blog.naver.com/ndb796/221228004692
'공부 > 알고리즘' 카테고리의 다른 글
계수 정렬(Counting Sort) (0) | 2020.06.01 |
---|---|
힙정렬 (0) | 2020.06.01 |
병합정렬 복습 (0) | 2020.05.29 |
퀵정렬 복습 (0) | 2020.05.28 |
삽입정렬 복습(Insertion Sort) (0) | 2020.05.27 |