티스토리 뷰
- 합병 정렬과 퀵 정렬
- 주어진 배열을 동일한 크기의 두부분 배열로 분할
- 정렬된 두 부분 배열을 합쳐서 하나의 정렬된 배열을 만듦
- 합병 정렬의 성능과 특징
- 최선/최악/평균 수행 시간이 모두 O(nlogn)
- 안정적인 정렬 알고리즘
- 퀵 정렬
- 퀵정렬의 성능과 특징
- 최악 수행 시간 O(n^2), 최선/평균 수행 시간 O(nlogn)
- 피벗 선택의 임의성만 보장되면 평균 성능을 보일 가능성이 매우 높음
- 제자리 정렬 알고리즘
- 안정적이지 않은 정렬 알고리즘
- 최악 수행 시간 O(n^2), 최선/평균 수행 시간 O(nlogn)
- 퀵정렬의 성능과 특징
- 힙 정렬
- 힙 자료구조의 장점을 활용한 정렬
- (최대)힙
- 완전 이진 트리
- 각 노드의 값은 자신의 자식 노드의 값보다 크거나 같다.
- 힙의 장점
- 임의의 값 삽입과 최대값 삭제가 용이
- 힙의 구현
- 일차원 배열
- 부모노드: i
- 자식노드: 2i+1(왼쪽 노드), 2i+2(오른쪽 노드)
- 자식노드(j)에서 부모노드를 찾아가고자 한다면 (j-1)/2
- 일차원 배열
- 임의의 값의 삽입
- 최대값 삭제
- 힙 정렬의 처리 과정
- 1차원 배열 -> 힙으로 변환
- 데이터의 개수만큼 아래과정을 반복함
- 힙의 최대값 삭제
- 힙의 재구성
HeapSort(A[], n){
for(i=0; i<n; i++){
par = (i/2) - 1;
while(par >= 0 && A[par] < A[i]){
A[par]과 A[i]의 교환;
i = par;
par = (i/2) - 1;
}
}
for(i=n-1; i>0; i--){
최대값 A[0]과 마지막노드 A[i]의 교환;
cur = 0; lch = 1; rch = 2;
do{
if(rch < i && A[lch] < A[rch]) lch = rch;
if(A[lch] > A[cur]) {
A[cur]과 A[lch]의 교환;
cur = lch;
lch = cur*2 + 1;
rch = cur*2 + 2;
}
else lch = i;
} while( lch < i)
}
}
-
-
- 초기 힙 구축
- 1차원 입력 배열 --변환--> 힙
- 두 가지 방법
- 방법1 -> 주어진 입력 배열의 각 원소에 대해 힙에서의 삽입 과정을 반복
- 방법2 -> 주어진 입력 배열을 우선 완전 이진 트리로 만든 다음에 아래에서 위로, 오른쪽에서 왼쪽으로 진행하면서 각 노드에 대해 힙의 조건이 만족되도록 자손 노드의 값과의 비교, 교환을 통해 조정
- 힙 정렬의 두 번째 단계(최대값 삭제 -> 힙 재구성)
- 성능 분석
- 최선, 최악, 평균의 경우 -> O(nlogn)
- 초기 힙 생성, 최대값 삭제 및 힙 재구성
- 바깦 루프 -> 입력 크기. n에 비례
- 안쪽 루프 -> 완전 이진 트리의 높이 logn에 비례
- 초기 힙 생성, 최대값 삭제 및 힙 재구성
- 최선, 최악, 평균의 경우 -> O(nlogn)
- 특징
- 안정적이지 않은 정렬 알고리즘
- 제자리 정렬 알고리즘
- 초기 힙 구축
-
- 비교 기반 정렬 알고리즘
- 키값을 직접적으로 비교해서 크기에 따라 순서를 정하는 방식
- 기본 성능 O(n^2) -> 버블 정렬, 선택 정렬, 삽입 정렬, 셸 정렬
- 향상된 성능 O(nlogn) -> 합병 정렬, 퀵 정렬, 힙 정렬
- 비교 기반으로 O(nlogn)보다 더 효율적인 성능의 정렬 알고리즘은 존재하는가?
- 비교 기반 정렬 알고리즘의 하한이 O(nlogn)인가?
- 하한 lower bound -> 최소한으로 필요한 성능, 가장 좋은 성능
- 비교 기반 정렬 알고리즘의 하한이 O(nlogn)인가?
- 비교 기반 정렬 알고리즘의 하한은?
- n=3인 세 개의 다른 숫자 a,b,c를 정렬하는 결정 트리
- 비교 기반 정렬 알고리즘의 하한 O(nlogn)
- n=3인 세 개의 다른 숫자 a,b,c를 정렬하는 결정 트리
- 키값을 직접적으로 비교해서 크기에 따라 순서를 정하는 방식
- 계수 정렬
- 비교 기반이 아닌 데이터의 분포를 이용한 정렬 방식
- 계수counting 정렬, 기수radix 정렬 -> 선형 시간 O(n)
- 주어진 원소 중에서 자신보다 작거나 같은 값을 갖는 원소의 개수를 계산하여 counting 정렬할 위치를 찾아 정렬하는 방식
- 입력값이 어떤 작은 정수 범위 내에 있다는 것을 알고 있는 경우에만 적용 가능
- 입력값의 범위 a~b에 해당하는 크기의 배열 COUNT[a,b]를 할당하고, 각 입력값을 한 번 조사하여 각 입력값의 출현 횟수의 누적값을 계산하여 적용
- 입력값이 어떤 작은 정수 범위 내에 있다는 것을 알고 있는 경우에만 적용 가능
- 특징
- 입력값의 범위가 입력 원소의 개수보다 작거나 비례할 때 유용
- 입력값의 범위를 k라고 할 때 O(n+k)시간
- 보통 k=O(n)일 때, 사용하므로 결국 선형 시간 O(n)을 가짐
- 입력값의 범위를 k라고 할 때 O(n+k)시간
- 안정적인 정렬 알고리즘
- 제자리 정렬 알고리즘이 아님
- 보편적이지 못한 방법
- 입력값의 범위를 미리 알아야 함
- 추가적인 배열이 필요 -> COUNT[], B[]
- 입력값의 범위가 입력 원소의 개수보다 작거나 비례할 때 유용
- 비교 기반이 아닌 데이터의 분포를 이용한 정렬 방식
- 기수 정렬
- 입력값을 자릿수별로 부분적으로 비교하는 정렬
- 주어진 데이터의 키값을 자릿수별로 나누고, 각 자릿수별로 계수 정렬과 같은 안정적인 정렬 알고리즘을 반복적으로 적용하여 정렬하는 방식
- LSD(Least Significant Digit) 기수 정렬 -> 낮은 자리부터 높은 자리로 진행
- MSD(Most Significant Digit) 기수 정렬 -> 높은 자리부터 낮은 자리로 진행
- 주어진 데이터의 키값을 자릿수별로 나누고, 각 자릿수별로 계수 정렬과 같은 안정적인 정렬 알고리즘을 반복적으로 적용하여 정렬하는 방식
- 성능 분석
- O(dn)
- d가 입력 크기 n보다 매우 작으면 O(n)
- O(dn)
- 특징
- 입력 원소의 값의 자릿수가 상수일 때 유용
- d 자릿수 n개의 숫자들에 대해 계수 정렬을 적용하면 O(dn)
- 여기서 d를 상수로 간주하면 O(n)
- d 자릿수 n개의 숫자들에 대해 계수 정렬을 적용하면 O(dn)
- 안정적인 정렬 알고리즘
- 제자리 정렬 알고리즘이 아님
- 계수 정렬 -> 전체 데이터 개수와 진법 크기만큼의 추가 공간이 필요
- 입력 원소의 값의 자릿수가 상수일 때 유용
- 입력값을 자릿수별로 부분적으로 비교하는 정렬
'algorithm' 카테고리의 다른 글
[algorithm] 탐색 알고리즘 (0) | 2021.05.09 |
---|---|
[algorithm] 정렬 알고리즘 (0) | 2021.04.27 |
[algorithm] 그리디 알고리즘 (0) | 2021.04.25 |
[algorithm] 그리디 알고리즘 (0) | 2021.04.17 |
[algorithm] 1952 달팽이 java (0) | 2021.04.14 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Java
- 병행프로세스
- 배열
- 알고리즘
- 동적프로그래밍
- 최단경로
- 인접행렬
- 재귀함수
- server side rendering
- 소프트웨어
- stackframe
- client side rendering
- 이진탐색
- dfs
- 운영체제
- javascript
- 인접리스트
- C++
- 클래스
- BFS
- Stack
- react
- 퀵정렬
- 교착상태
- 스텍
- 세마포어
- C
- 구조체
- 입출력장치
- 자료구조
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
글 보관함