C++/STL

C++ STL 정리 - 정렬

728x90

C++ 의 알고리즘 라이브러리에서 제공되는 정렬은 3가지가 있다

 

1. sort()

: 퀵소트를 기반으로하는 일반적인 정렬 방식이다.

sort() 함수 사용시 주의할 점은 RandomAccessIterator 타입만 사용이 가능하다

STL 의 컨테이너 중 Vector, Deque 만 사용 가능하다.

다른 타입의 컨테이너를 사용하면 오류발생.

 

- 기본연습문제

1. 수 정렬하기 2 www.acmicpc.net/problem/2751

(예시 코드)

#include <bits/stdc++.h>
 
#define endl "\n"
 
using namespace std;
 
int n;
 
int main() {
    cin.tie(0);
    ios_base::sync_with_stdio(0);
    
    cin >> n;
    vector<int> vec(n, 0);
    for (int i = 0; i < n; ++i) cin >> vec[i];
    
    sort(vec.begin(), vec.end());
    
    for (int i = 0; i < n; ++i) cout << vec[i] << endl
    return 0;
}
cs

 

2. 수 정렬하기 4 www.acmicpc.net/problem/11931

(예시코드)

 

#include <bits/stdc++.h>
 
#define endl "\n"
 
using namespace std;
 
int n;
vector<int> vec;
 
bool comp(int& a, int& b) {
    return a > b;
}
 
int main() {
    cin.tie(0); ios_base::sync_with_stdio(0);
    
    cin >> n;
    for (int i = 0; i < n; ++i) {
        int num;
        cin >> num;
        vec.push_back(num);
    }
    
    sort(vec.begin(), vec.end(), comp);
    
    for (int i = 0; i < vec.size(); ++i) cout << vec[i] << endl;
    
    return 0;
}
cs

 

2. stable_sort()

: 정렬을 하긴 하되, 원소들의 그 순서를 보존하는 방식으로 정렬을 수행한다.

 

- 기본연습문제

: 나이순 정렬 www.acmicpc.net/problem/10814

 

위 문제를 보면 나이를 오름차순으로 정렬하되, 나이가 만약 같은 경우, 먼저 가입한 사람 (입력이 먼저된) 순서대로 정렬할것을 요구하고 있다.

이때 가장 간편하게 쓸 수 있는게 stable_sort() 이다. 

아래와 같이 코드를 작성해주면, 나이순으로 정렬하되, 나이가 동일할때 이름에 대한 입력 순서는 그대로 유지한다.

 

(예제 코드)

#include <bits/stdc++.h>
 
#define endl "\n"
 
using namespace std;
 
int n;
vector<pair<intstring>> vec;
 
bool comp(pair<intstring>& p1, pair<intstring>& p2) {
    return p1.first < p2.first;
}
 
int main() {
    cin.tie(0); ios_base::sync_with_stdio(0);
    
    cin >> n;
    for (int i = 0; i < n; ++i) {
        int age;
        string name;
        cin >> age >> name;
        vec.push_back(make_pair(age, name));
    }
    
    stable_sort(vec.begin(), vec.end(), comp);
    
    for (int i = 0; i < vec.size(); ++i) {
        cout << vec[i].first << " " << vec[i].second << endl;
    }
    
    return 0;
}
cs

 

3. partial_sort()

: 일부분만 정렬하는 함수로, 기본적으로 다음과 같이 3개의 인자를 받는다

std::partial_sort(start, middle, end);
cs

 

전체 범위 [start, end) 사이에서, [start, middle) 까지만 오름 차순으로 정렬시키고 나머지 뒷 부분은 랜덤하게 남게되는 정렬 방식이다.

 

(예시 코드)

#include <bits/stdc++.h>
 
#define endl "\n"
 
using namespace std;
 
int n = 10;
vector<int> vec;
 
int main() {
    cin.tie(0); ios_base::sync_with_stdio(0);
    
    for (int i = 0; i < n; ++i) {
        int score;
        cin >> score;
        vec.push_back(score);
    }
    
    partial_sort(vec.begin(), vec.begin() + 5, vec.end());
    
    for (int i = 0; i < n; ++i) 
        cout << vec[i] << " ";
    
    return 0;
}
cs

 

 

 

 

- 참조

modoocode.com/225#page-heading-1

728x90

'C++ > STL' 카테고리의 다른 글

C++ STL 정리 - Stack  (0) 2020.09.27
C++ STL 정리 - Map  (0) 2020.09.10
C++ STL 정리 - Set  (0) 2020.09.07
C++ STL 정리 - Vector  (0) 2020.08.28
C++ STL 정리 - 개요  (0) 2020.08.25