이 글은 한양대 김경환 교수님 강의를 정리했음을 먼저 밝힙니다.
추가로 같이보면 좋은 자료 : ratsgo's blog for textmining 정렬 알고리즘 비교
✅ 주어진 데이터를 일정한 기준에 따라 순서대로 나열하는 것
집합(set)
: 정렬할 데이터 셋 전체원소(element)
: 데이터 섯의 datum부분 집합(subset)
: 전체 데이터셋을 어떤 기준으로 분할한 일 부분키(key)
: 정렬의 기준이 되는 특정 값비교(comparison)
: 정렬 = 크기 또는 순서를 비교하는 것이동(move)
: 비교의 결과에 따라 위치 재조정교환(swap)
: 두 개 원소의 자리를 서로 맞바꿈시간복잡도(time complexity)
: 알고리즘 수행에 필요한 연산의 수(CPU Time)공간복잡도(space complexity)
: 알고리즘 수행에 필요한 메모리의 크기분할정복(divide&conquer)
: 커다란 데이터셋을 MECE 규칙에 따라 작게 분할하여 계산병합(merge)
: 두 개 부분집합을 입력 받아 하나의 합집합을 출력하는 연산피벗(pivot)
: 회전축, 축, 중심 / 재귀적으로 실행할 때 매 단계의 기준이 되는 원소기수(radix)
: 10진수 체계에서는 기수가 10, base라고도 함최선(best case)
: 가장 좋은 성능을 보이는 경우최악(worst case)
: 가장 좋지 않은 성능을 보이는 경우안정성(stability)
: 알고리즘의 실행 결과를 신뢰할 수 있는 정도+) 원소 개수가 10일 때, 100일 때 O(N2)과 O(N * logN) 비교
▶ 원소의 개수가 많아질수록 격차가 큼 (n2이 큰 격차로 시간 복잡도가 큼)
⏺ 계산 시간이 정렬할 원소의 수의 제곱에 비례
⏺ 지수 함수에 비례
⏺ 알고리즘은 직관적이고 쉬움
- 정렬 대상 원소 선정
- 이전 단계에서 정렬된 원소를 제외한 모든 원소가 정렬 대상
- 정렬된 원소는 끝에서부터 채워짐- 맨 처음 원소부터 마지막 원소까지 반복
- 인접한 두 원소의 값을 비교하여 자리 교환(swap)
- 반복하다보면 제일 큰 원소가 마지막 자리에 위치하게됨- 더 이상 정렬할 원소가 없을 때까지 위 과정 반복
- 정렬 대상 원소 선정
- 이전 단계에서 정렬된 원소를 제외한 모든 원소가 정렬 대상
- 정렬된 원소는 앞에서부터 채워짐
- 기준 위치 조정- 맨 처음 원소부터 마지막 원소까지 반복
- 기준 원소 제외 나머지 원소를 비교하여 가장 작은 원소를 선택
- 선택한 원소가 기준 원소보다 작으면 위치 교환- 더 이상 정렬할 원소가 없을 때까지 위 과정 반복
정렬된 부분 집합
과 정렬되지 않은 부분 집합
으로 분할
- 정렬 대상 원소 선정
-정렬되지 않은 부분집합
에서 원소 한 개를 선택정렬된 부분 집합
에 위 원소를 삽입
- 선택된 원소를정렬된 부분 집합
의 원소들과 비교
- 삽입할 위치를 찾아 삽입정렬되지 않은 부분 집합
이 공집합이 될 때까지 위 과정 반복
⏺ 계산 시간이 (원소의 개수*로그값)에 비례
⏺ 밑이 2인 로그함수에 비례
⏺ 알고리즘이 상대적으로 복잡함
🅰 대체로 좋은 성능을 보여주는 알고리즘 그룹
- 정렬 대상 분할
- 전체 원소를 최소 원소의 부분 집합으로 분할(하나씩 다 뜯어놓음)- 분할된 부분 집합 두 개를 정렬하여 하나로 결합
- 각각의 부분 집합은 이미 정렬된 상태 (처음에는 1개씩이고, 이후에는 정렬해서 결합하기 때문에)
- 각 부분 집합의 원소를 하나씩 비교해가면서 정렬- 전체 원소가 하나의 집합이 될 때까지 위 과정 반복
이미지 출처 : Heee's Development Blog
- 정렬 대상을 Heap Tree에 삽입
- 전체 원소를 앞에서부터 차례로 Heap Tree에 삽입- Heap Tree의 root 방문, 제거, 정렬 결과에 배치
- 현재 Heap Tree의 root를 방문, 그 값을 정렬 결과에 배치
- Max Heap인 경우 맨 끝에서부터, Min Heap인 경우 맨 앞에서부터 순회
- 배치 후 root는 제거 → Heap Tree는 알아서 정리 됨- Heap Tree가 empty 상태가 될 때까지 위 과정 반복
- 정렬 대상을 왼쪽, 오른쪽 부분 집합으로 구분할 피벗 선택
- L, R 원소 찾기와 자리 교환
- 왼쪽 부분 집합의 왼쪽 끝에서 오른쪽으로 순회하며 피벗보다 크거나 같은 원소 L 탐색
- 오른쪽 부분 집합의 오른쪽 끝에서 왼쪽으로 순회하며 피벗보다 작은 원소 R 탐색
- L이 R을 만나면 / R이 L을 만나면 멈춤
- L, R이 있을 경우 서로 교환(swap) 위 과정 반복
- L과 R이 같은 원소에서 만나는 경우, R과 피벗을 교환
- 교환된 자리를 피벗으로 지정한 후 위 과정 반복- 모든 부분 집합의 크기가 1 이하가 될 때까지 위 과정 반복