728x90

벡터든 배열이든 정렬을 하려면 <algorithm> 라이브러리의 sort() 함수를 쓰면 된다. 따라서 <algorithm> 헤더파일을 포함해줘야 한다.
sort() 함수의 첫번째 두번째 매개변수는 iterator, 즉 포인터이다.

 

sort - C++ Reference

custom (2)template void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

www.cplusplus.com

배열의 경우 (배열의 크기가 10인 경우)

sort(arr, arr + 10);

벡터의 경우

sort(v.begin(), v.end());

이렇게 하면 된다.

 

첫 번째 인자로는
정렬하고 싶은 데이터 집합이 배열이라면 배열의 이름을 넘겨주면 되고 (배열의 이름은 포인터니까)
벡터라면 v.begin()을 넘겨주면 된다. (벡터에서 v.begin()을 하면 벡터의 시작 주소를 반환한다.)
두 번째 인자로는
정렬하고 싶은 데이터 집합이 배열이라면 배열의 이름 + 배열의 크기을 넘겨주면 되고
벡터라면 v.begin()을 넘겨주면 된다. (벡터에서 v.end()을 하면 벡터의 마지막 주소를 반환한다.)
이렇게 매개변수 두 개를 모두 넣어주고 sort() 함수를 호출하면 오름차순으로 정렬된다.

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

int main() {
	vector<int> v = { 4, 7, 2, 5, 10, 8, 1, 6, 3 };
    cout << "정렬 전: "; 
    for (int i = 0; i < v.size(); i++) {
    	cout << v[i] << " "; 
    }
    cout << endl;
    sort(v.begin(), v.end());
    cout << "정렬 후: ";
    for (int i = 0; i < v.size(); i++) {
    	cout << v[i] << " ";
    } 
    cout << endl; 
    return 0; 
}

이 코드의 실행 결과는 다음과 같다.

sort() 함수 호출 이후에는 오름차순으로 정렬되어 있는 것을 볼 수 있다.

배열로 해도 마찬가지이다.

#include <iostream> 
#include <algorithm> 
using namespace std; 
int main() { 
	int arr[10] = { 9, 4, 7, 2, 5, 10, 8, 1, 6, 3 }; 
    cout << "정렬 전: "; 
    for (int i = 0; i < 10; i++) { 
    	cout << arr[i] << " "; 
    } 
    cout << endl; 
    sort(arr, arr + 10); 
    cout << "정렬 후: "; 
    for (int i = 0; i < 10; i++) { 
    	cout << arr[i] << " "; 
    } 
    cout << endl; 
    return 0; 
}

이 코드를 실행해도

배열의 원소들이 오름차순으로 정렬된 것을 볼 수 있다.
벡터를 정렬하려면 sort(v.begin(), v.end());이고
배열을 정렬하려면 sort(arr, arr + 10);라는 것 기억하자.

 

벡터를 내림차순으로 정렬하고 싶다면 sort(v.begin(), v.end()); 대신에 sort(v.rbegin(), v.rend());를 쓰면 된다.

sort(v.rbegin(), v.rend());



그런데 오름차순이 아니라 내가 원하는 정렬 기준을 세워서 정렬하고 싶다면? 정렬하고 싶은 대상이 기초 타입이 아니라면?
sort() 함수의 세 번째 인자로 비교기준이 되는 함수포인터 또는 함수 객체를 넣어주면 된다.
그 함수는 반환타입이 bool 타입이어야 하고 매개변수는 두 개이며 두 매개변수의 타입은 정렬할 데이터의 타입과 일치해야 한다.
내림차순으로 정렬하고 싶다면 compare 함수를 이렇게 만들면 된다.

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

이 cmp 함수를 sort() 함수의 3번째 인자로 넣어서 아래 코드를 실행하면

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

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

int main() {
    vector<int> v = { 4, 7, 2, 5, 10, 8, 1, 6, 3 };
    cout << "정렬 전: "; 
    for (int i = 0; i < v.size(); i++) { 
    	cout << v[i] << " "; 
    } 
    cout << endl; 
    sort(v.begin(), v.end(), cmp); 
    cout << "정렬 후: "; 
    for (int i = 0; i < v.size(); i++) { 
    	cout << v[i] << " "; 
    } 
    cout << endl; 
    return 0; 
}

이렇게 내림차순으로 정렬된 것을 볼 수 있다.

배열을 정렬할 때에도 똑같이 하면 된다.

#include <iostream> 
#include <algorithm> 
using namespace std; 
bool cmp(int a, int b) { 
	return a > b;
} 

int main() { 
	int arr[10] = { 9, 4, 7, 2, 5, 10, 8, 1, 6, 3 }; 
    cout << "정렬 전: "; 
    for (int i = 0; i < 10; i++) { 
    	cout << arr[i] << " "; 
    } 
    cout << endl; 
    sort(arr, arr + 10, cmp); 
    cout << "정렬 후: "; 
    for (int i = 0; i < 10; i++) { 
    	cout << arr[i] << " "; 
    } 
    cout << endl; 
    return 0; 
}

위 코드의 실행 결과. 배열이 내림차순으로 정렬 되었다.

이렇게 배열과 벡터를 정렬하는 방법을 배워보았다.
만약에 정렬하고 싶은 자료들의 타입이 기초타입이 아니라 내가 정의한 클래스라고 해도 compare 함수만 구현해서 sort 함수의 인자로 넣어준다면 나만의 기준으로 정렬할 수 있다.



728x90

+ Recent posts