티스토리 뷰
정렬 알고리즘 정리에 앞서 두 가지를 정리하였다.
안전 정렬 ( stable ) |
불안전 정렬 ( not stable ) |
같은 값(key)의 위치가 정렬 과정에서 바뀌지 않는 것 |
같은 값(key)의 위치가 정렬 과정에서 바뀌는 것 |
내부 정렬 ( Internal sorting ) | 외부 정렬 ( External sorting ) |
데이터의 크기가 주 기억장소 용량보다 적을 경우 기억장소를 활용하여 정렬 | 데이터의 크기가 주 기억장소 용량보다 클 경우 외부 기억장치를 사용하여 정렬 |
가장 효율적인 정렬 알고리즘이 무엇인가? 라는 질문에 대한 답은 상황에 따라 다르다이다.
데이터의 크기, 양, 정렬상태 등 다양한 상황에 따라 최적의 정렬 알고리즘을 선택하기 위해 각각의 정렬 알고리즘들을 정리하였다.
1. Bubble Sort
시간 복잡도 |
공간 복잡도 |
||
최악 |
최선 |
평균 |
|
|
|
|
- 안전 정렬 - 내부 정렬 - 비교와 교환
- 연산이 완료되었는지를 나타내는 flag를 통한 코드 수정으로 복잡도 줄일 수 있다.
- 이미 정렬이 되어 있는지 확인 가능하다.
- 가장 쉬운 정렬 알고리즘 - 시간복잡도가 높아 잘 사용하지 않는다
- 나란히 있는 2개의 데이터를 계속해서 바꾸어 나간다.
- 데이터가 적고 단순한 구현이 필요한 경우 사용한다.
2. Selection Sort
시간 복잡도 | 공간 복잡도 | ||
최악 | 최선 | 평균 |
|
|
|
|
- 불안전 정렬 - 내부 정렬 - 비교와 교환
- 데이터 중 최솟값을 선택하여 제일 앞과 자리를 바꾸며 정렬한다.
- 데이터가 적을 때 사용한다.
- 데이터의 초기 정렬형태에 영향을 받지않고 일정한 시간 복잡도를 나타낸다.
- 거품 정렬에 비해 2~3배 빠르다.
3. Insertion Sort
시간 복잡도 | 공간 복잡도 | ||
최악 | 최선 | 평균 |
|
|
|
|
- 안전 정렬 - 내부 정렬 - 비교와 교환
- 데이터에 대해 더 작거나 큰 값이 나올때까지 진행하며 값을 찾아가며 바꾼다.
- 버블, 선택 정렬보다 빠르고 안전성이 높아 다른 분할정복으로 구현되는 알고리즘의 base가 된다.
- 이미 정렬된 상태면 최선의 시간 복잡도가 나온다. 반면 역순으로 정렬되어 있는 경우 최악의 시간 복잡도가 나온다.
- 선택 정렬보다 2배정도 빠르다. - 많은 이동때문에 적은 양의 데이터에 유리하다.
- 데이터의 초기 정렬형태에 영향을 받는다.
4. Shell Sort
시간 복잡도 | 공간 복잡도 | ||
최악 | 최선 | 평균 |
|
|
|
|
- 불안전 정렬 - 내부 정렬 - 비교와 교환
- 속도가 빠르다.
- 정렬되지 않은 데이터의 경우에 비효율적인 삽입정렬을 개선한 방법
- 일정한 간격(gap)으로 그룹을 만들어 각각 삽입정렬을 한 후 전체를 간격 1로 보고 삽입정렬로 종합한다.
- 간격에 따라 시간 복잡도가 결정되며 아직 정확한 시간 복잡도는 확인되지 않았다. 약 n의 1.25승 정도이다.
- 일정한 간격의 수열이 서로 소가 되게 정의해야 성능이 좋아진다. (ex 701, 301, 132, 57, 23, 10, 4, 1)
- 간격에 따른 그룹 별 정렬 방식이 H/W로 정렬 알고리즘을 구현하는데 적합하여 임베디드 시스템에 주로 사용된다.
5. Merge Sort
시간 복잡도 | 공간 복잡도 | ||
최악 | 최선 | 평균 |
|
|
|
|
- 안전 정렬 - 외부 정렬
- 외부 정렬로 몇 번 패스(read/write)하냐 를 가지고 시간 복잡도를 측정한다.
- 가장 많이 쓰이는 알고리즘 중 하나이다.
- 데이터를 2개의 균등 크기로 분할하고, 각각 재귀적으로 합병 정렬을 이용하여 정렬한 후 합병한다.
- 데이터 크기만큼 외부 메모리가 필요하다.
- 퀵 정렬과 달리 안정적인 복잡도를 발휘한다.
- 데이터의 초기 상태에 별로 영향을 받지 않는다.
6. Tim Sort
시간 복잡도 | 공간 복잡도 | ||
최악 | 최선 | 평균 |
|
|
|
|
- 안전 정렬 - 외부 정렬 - 2분할 삽입 정렬 + 병합 정렬
- 병합 정렬일 때 요소수가 적은 경우 오버헤드에 의해 느려진다. 이를 개선한 알고리즘
- 미리 어느 정도의 크기의 정렬이 끝난 열(run)로 분할하고 병합한다.
- run은 32보다 작게 하여 2분할 삽입 정렬을 한다.
- 가장 많이 쓰이는 알고리즘 중 하나이다.
- 데이터를 2개의 균등 크기로 분할하고, 각각 재귀적으로 합병 정렬을 이용하여 정렬한 후 합병한다.
- 데이터 크기만큼 외부 메모리가 필요하다.
- 퀵 정렬과 달리 안정적인 복잡도를 발휘한다.
- 데이터의 초기 상태에 별로 영향을 받지 않는다.
7. Quick Sort
시간 복잡도 | 공간 복잡도 | ||
최악 | 최선 | 평균 |
|
|
|
|
- 불안전 정렬 - 내부 정렬
- 실제 데이터에서 빠르다고 알려져서 가장 많이 쓰는 알고리즘
- 최악의 경우에 시간 복잡도가 큰 약점이 있다.
- 임의의 값(pivot)을 기준으로 한쪽은 pivot보다 작은 것, 다른 쪽은 큰것으로 나누어(partition) 양쪽을 다시 재귀로 반복한다.
- pivot을 선택이 매우 중요하다.
- 원소 개수가 한자리로 떨어졌을 때는 재귀가 아니라 삽입 정렬로 효율을 높일 수 있다.
- 정렬된 데이터에 대해서는 시간이 더 걸린다.
8. Intro Sort
시간 복잡도 | 공간 복잡도 | ||
최악 | 최선 | 평균 |
|
|
|
|
- 불안전 정렬 - 내부 정렬
- 퀵 정렬의 개량 버전이다.
- 퀵 정렬에서 pivot의 선택에 의해 시간 복잡도가 최악으로 되는 경우를 대처하기 위해 재귀 탐색이 요소수의 대수를 넘으면
힙 정렬로 바꾼다. 또한 퀵 정렬에서 32미만의 데이터 수의 경우 오버헤드를 적게하기 위해 삽입 정렬로 바꾼다.
9. Heap Sort
시간 복잡도 | 공간 복잡도 | ||
최악 | 최선 | 평균 |
|
|
|
|
- 불안전 정렬 - 내부 정렬
- 퀵 정렬의 최악의 경우 때문에 힙 정렬을 많이 쓴다.
- 힙 조건(각 노드의 값이 자식 노드 값보다 커야 한다)을 만족하는 완전 이진 트리이다.
- 배열에 저장하여 힙을 만든 후 n개의 데이터를 삭제하고 힙을 재구성하는 과정을 반복한다. 삭제된 노드를 배열에 차례로 저장하면 정렬된 리스트가 된다.
- 재구성은 이진 트리를 힙으로 만들기 위한 재구성으로 트리의 깊이 만큼의 시간이 걸린다.
10. Counting Sort
시간 복잡도 | 공간 복잡도 | ||
최악 | 최선 | 평균 |
|
|
|
|
- 데이터에서 최대값 만큼의 메모리가 필요하다. 따라서 메모리 낭비가 있을 수 있다.
- 정렬하는 데이터들의 값이 특정한 범위 안에 있을 때 사용한다.
- 데이터의 처음부터 끝까지 돌면서 각 숫자가 몇번 등장하는지 counting한다.
11. Radix Sort
시간 복잡도 | 공간 복잡도 | ||
최악 | 최선 | 평균 |
|
|
|
- 데이터를 특정 진수로 자릿수 별로 정렬하는 알고리즘이다.
- 비교 정렬 알고리즘에서 가장 빠르다.
- radix(기수), 즉 특정 진수로 일의 자리, 십의 자리, 백의 자리, 이렇게 차례로 정렬한다.
- 기수의 크기만큼의 메모리가 필요하다.
- 부동 소숫점, 음수값 처럼 특수한 비교 연산에는 불가능하다.
- 숫자, 알파벳 관련 데이터 등 대용량 데이터 정렬에 적절하다.
12. Bucket Sort
시간 복잡도 | 공간 복잡도 | ||
최악 | 최선 | 평균 |
|
|
|
- n개의 데이터에 대해 범위를 n개로 나누고 n개의 버킷을 만든다. 그 후 각 데이터를 버킷에 넣고 버킷 별로 정렬하여 합친다.
- 데이터가 확률적으로 균등하게 분포한다고 가정할 때 성능이 나타난다.
- 연결 리스트로 버킷을 구성할 수 있고, 버킷들을 정렬할 때는 퀵 정렬 등을 사용한다.
정리
- 데이터의 값을 정확히 모른다면 Heap을 사용하면 가장 무난한 성능을 기대할 수 있다.
- 만약 데이터가 정렬되어 있거나 거의 정렬되어 있으면 Insertion 이나 Tim을 사용한다.
- quick 보다는 intro가 더 성능이 좋으므로 무난하게 사용한다.
정렬 알고리즘 별 비교 및 요약 :
작성자 : 히더
'알고리즘 > 이론' 카테고리의 다른 글
[알고리즘] 기본 및 복잡도 (0) | 2018.09.29 |
---|---|
[알고리즘] 완전 탐색 (Brute Force) (0) | 2018.08.27 |
- Total
- Today
- Yesterday
- 이차원 배열과 연산
- DFS
- hackerrank
- 17142
- 역량 테스트
- 시간 복잡도
- 알고리즘
- 백준
- 2018 KAKAO BLIND RECRUITMENT
- string
- scanf
- 2018 카카오 블라인드 채용
- 연구소 3
- SW Expert Academy
- DP
- 팁
- 17143
- SWEA
- 미세먼지 안녕!
- 17779
- boj
- 새로운 게임 2
- 17144
- 삼성
- 17140
- 입출력
- 17837
- STL
- 게리맨더링 2
- 트렌드
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |