[C++ STL] '정렬 알고리즘(sort algorithm)'
'컨테이너'를 사용하면서 그 안에 든 원소들을 자신이 원하는 기준으로 정렬시키고 싶을 때가 있을텐데, 이 때 '정렬 알고리즘'을 사용하시면 됩니다. 먼저, 어떤 것들이 있는지 표로 나열해보겠습니다.
정렬 알고리즘(sort algorithm) | 설명(p는 구간의 반복자) |
p = partition(b, e, f) | 구간 [b, e)의 원소들 중 f(*p)가 참인 원소는 [b, p)에 나열하고, 거짓인 원소는 [p, e)에 나열합니다. |
stable_partition(b, e, f) | 위의 함수와 같은 기능을 하고, 추가적으로 원소들을 조건에 따른 참, 거짓으로 분류할 때 기존의 순서를 유지시켜줍니다. |
sort(b, e) | 구간 [b, e)의 원소들을 퀵 정렬을 기준으로 정렬합니다. |
sort(b, e, f) | 위의 알고리즘의 조건자 버전입니다. |
stable_sort(b, e) | 구간 [b, e)의 원소들을 합병 정렬을 기준으로 정렬합니다. 이 때, 기존 원소들의 순서를 유지시켜줍니다. |
stable_sort(b, e, f) | 위의 알고리즘의 조건자 버전입니다. |
make_heap(b, e) | 구간 [b, e)의 순차열을 '힙 구조'로 변경합니다. |
push_heap(b, e) | make_heap()을 통해 생성한 힙의 원소를 추가합니다. |
pop_heap(b, e) | make_heap()을 통해 생성한 힙의 원소를 제거합니다. |
sort_heap(b, e) | make_heap()을 통해 생성한 힙의 원소를 정렬합니다. |
먼저, partition() 알고리즘을 살펴보겠습니다. 만약 내가 '컨테이너'에 든 100여개의 원소들을 50을 기준으로 50보다 큰 원소들과 작은 원소들을 분류하고 싶다면 어떻게 해야 할까요? 이때 partition() 알고리즘을 사용하시면 됩니다.
bool Pred(int n) { return n < 40; } void main() { vector<int> v; v.push_back(10); v.push_back(42); v.push_back(68); v.push_back(20); v.push_back(56); v.push_back(31); // 40을 기준으로 보다 작은 값과 큰 값으로 분류합니다. auto iter_sep = partition(v.begin(), v.end(), Pred); // 40보다 작은 값의 순차열 for (auto iter = v.begin(); iter != iter_sep; ++iter) cout << *iter << " "; // 40보다 큰 값의 순차열 for (auto iter = iter_sep; iter != v.end(); ++iter) cout << *iter << " "; }
나머지는 사용법이 비슷하니 건너뛰고, *_heap() 류의 알고리즘을 살펴보겠습니다. make_heap() 알고리즘의 설명을 보면 순차열을 '힙 구조'로 변경한다고 하는데 이게 무슨 말일까요? 여기서 말하는 '힙 구조'란 완전 이진 트리를 기반으로 한 힙 자료구조를 말합니다.

'힙 자료구조'는 2가지가 있습니다.
1. 부모 노드가 자식 노드보다 큰 값을 가지는 '최대 힙'
2. 부모 노드가 자식 노드보다 작은 값을 가지는 '최소 힙'
'힙 자료구조'는 최댓값과 최솟값을 탐색하는 시간이 빠른 자료구조입니다. '힙'의 시간복잡도는 아래와 같습니다.
'Programming > C C++' 카테고리의 다른 글
[C++/Build] 빌드 자동화를 위한 make 유틸리티 (0) | 2019.06.17 |
---|---|
[C++/Build] Makefile - 빌드 자동화 (0) | 2019.06.13 |
[C++ STL] '탐색 알고리즘(search algorithm)' (0) | 2019.05.29 |
[C++ STL] '연관 컨테이너 - map' (0) | 2019.05.29 |
[C++ STL] '연관 컨테이너 - set' (0) | 2019.05.27 |
댓글
이 글 공유하기
다른 글
-
[C++/Build] 빌드 자동화를 위한 make 유틸리티
[C++/Build] 빌드 자동화를 위한 make 유틸리티
2019.06.17공식 레퍼런스: https://www.gnu.org/software/make/manual/make.html GNU에서 제공하는 make 유틸리티는 빌드 자동화를 위한 툴입니다. 레퍼런스를 보면 컴파일러를 가진 어떤 언어든 상관없이 쉘 스크립트를 통해 자동화가 가능하며, 프로그램 빌드뿐만 아니라 파일의 업데이트 여부와 같은 변화도 체크할 수 있다고 합니다. 하지만 일반적으로 C/C++ 언어의 빌드 자동화를 위한 툴로 많이 사용됩니다. make 유틸리티는 파일들 사이의 관계와 용도(헤더 파일을 어떻게 링크시키고 어떤 식으로 컴파일할지)를 makefile에 정의해두면 어떤 환경에서든 동일한 빌드가 가능하게 해줍니다. 즉, makefile을 작성하는 방법만 알면 GNU에서 제공해주는 유용한 빌드 자동화 툴인 m… -
[C++/Build] Makefile - 빌드 자동화
[C++/Build] Makefile - 빌드 자동화
2019.06.13Makefile은 리눅스 플랫폼에서 제공하는 빌드 자동화 유틸리티입니다. make 유틸리티는 프로그래밍언어처럼 그 안에서 사용되는 작은 규모의 문법이 있습니다. 변수를 정의할 수 있고, 몇 가지 유용한 함수도 제공합니다. CC = g++ CFLAGS = -lpcap TARGET = arp_spoof RM = rm -f SOURCE_DIR = src INCLUDE_DIR = include BINARY_DIR = bin default: $(TARGET) all: default OBJECTS = $(patsubst %.cpp, %.o, $(wildcard $(SOURCE_DIR)/*.cpp)) HEADERS = $(wildcard $(INCLUDE_DIR)/*.h) $(TARGET): $(OBJECTS) @m… -
[C++ STL] '탐색 알고리즘(search algorithm)'
[C++ STL] '탐색 알고리즘(search algorithm)'
2019.05.29C++ STL에서 제공하는 컨테이너에는 기본적인 기능을 담은 멤버 함수가 있습니다. 그리고 그것과는 별개로, STL에선 알고리즘(algorithm)을 제공합니다. STL algorithm은 algorithm 헤더 파일을 통해 사용할 수 있습니다. 알고리즘과 컨테이너간의 관계를 그림으로 표현하면 다음과 같습니다. 위의 그림에서 보시는 것처럼 '알고리즘'이라는건 '컨테이너'에 들어있는 원소들을 조작할 수 있는 함수들의 모임이라고 생각하시면 됩니다. '컨테이너'에 들어있는 원소들을 어떤 기준을 가지고 정렬시키고 싶을 수도 있을 것이고, '컨테이너'에 들어있는 원소 집합 중에서 특정한 값이 들어있는지 찾고싶을 때도 있을 것이고, 어떤 조건에 해당하는 원소들을 집합에서 제거시키고 싶을 수도 있을 것이고, '컨테이… -
[C++ STL] '연관 컨테이너 - map'
[C++ STL] '연관 컨테이너 - map'
2019.05.29'map 컨테이너'는 연관 컨테이너 중 가장 많이 사용되는 컨테이너입니다. 'map 컨테이너'는 (key, value) 쌍을 저장합니다. 이때, (key, value) 쌍을 저장하기 위해 'pair 객체'를 사용합니다. 'set 컨테이너'와 마찬가지로 key 값은 중복될 수 없습니다. 중복을 허용하고 싶다면 'multimap 컨테이너'를 사용해야 합니다. 모든 연관 컨테이너는 동일한 인터페이스를 제공하기 때문에 앞의 'set 컨테이너'에서 정리한 인터페이스를 참고바랍니다. 추가로, 'map 컨테이너'는 [] 연산자를 제공하기 때문에 간단히 원소를 저장하고 참조할 수 있습니다. 다음은 'map 컨테이너'의 구조입니다. 'map 컨테이너'의 insert() 멤버 함수를 통한 원소 삽입 예제를 살펴보겠습니다….
댓글을 사용할 수 없습니다.