Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 값타입
- 관계형 데이터베이스
- ROLLBACK
- Spring
- Spring Data JPA
- 정렬
- relational DB
- n+1문제
- 즉시로딩
- Flush
- fetch join
- relational database
- 영속성 컨텍스트
- Embeddable
- MappedSuperclass
- DiscriminatorValue
- 플러시
- commit
- Algorithm
- 영속성전이
- 고아객체
- 순수jpa
- DiscriminatorColumn
- DB
- 분할상환분석
- JPA
- 엔티티 매핑
- Amortized Analysis
- 지연로딩
- 페치조인
Archives
- Today
- Total
Jun's note
[Algorithm] Quick Sort (퀵정렬) C++ 본문
728x90
1. 퀵정렬 정의
임의로 pivot 잡은 후 pivot보다 작은 그룹을 왼쪽. 큰 그룹을 오른쪽으로 분할하여 해결한다. (분할 정복 방법)
- 분할 정복 방법 (divide-and-conquer)
- 큰 문제를 작은 문제 단위로 쪼개면서 해결한다.
- 문제를 2개의 문제로 분리하는데, 원소개수가 1개가 될 때까지 분리한다. 그 다음 작은 문제에서부터 결과를 모아 원래 문제를 해결한다.
- 멀리 있는 값들끼리 교환이 일어나므로 불안정한 정렬이다.
- 퀵정렬은 분할, 정복, 결합 단계로 이뤄진다.
- 분할(Divide): 피벗을 중심으로 피벗보다 작은 원소는 왼쪽, 큰 원소는 오른쪽으로 분할한다.
- 정복(Conquer): 부분 배열을 정렬한다.
- 결합(Combine): 정렬된 부분 배열들을 하나의 배열로 합친다.
2. 퀵정렬 특징
- 장점
빠르다 -> O(nlogn)
- 단점
최악의 경우 느리다. -> O(n^2)
3. 시간 복잡도
- Best Case
피벗을 잘 잡아, 부분배열의 개수가 n/2로 나눠질 경우 : O(nlogn)
Recursion Tree의 깊이 : 최대 logn 이기 때문
- Worst Case
부분배열 개수가 불균형하게 분할 되는 경우(n-1,0개) : O(n^2)
Recursion Tree의 깊이 : 최대 n 이기 때문
4. 구현 방법 (C++)
#include <algorithm> //swap
void quickSort(int A[], int low, int high) {
if(low >= high) return; // base condition
// divide process
int i = low, j = low;
int&pivot = A[high];
for (; j < high; ++j) {
if ( A[j] < pivot)
swap(A[i++], A[j]);
}
swap(A[i], pivot);
// conquer process
quickSort(A, low, i-1);
quickSort(A, i+1, high);
}
'Computer Science > Algorithm' 카테고리의 다른 글
[Algorithm] 기수정렬 (Radix Sort) C++ (0) | 2022.01.06 |
---|---|
[Algorithm] 합병정렬 (Merge Sort) C++ (0) | 2022.01.04 |
[Algorithm] Insertion Sort (삽입정렬) C++ (0) | 2022.01.02 |
Amortized Analysis (분할상환분석) (0) | 2021.12.31 |
Comments