일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 클린
- 트리
- 선형 리스트
- mysql
- @ComponentScan
- java
- 코드
- JsonNode
- 쿼리메소드
- 마크다운
- query
- 리스트
- 배열
- code
- 내부 정렬
- 마크다운 테이블
- @RequiredArgsConstructor
- @NoArgsConstructor
- 계산 검색 방식
- 빅 오 표기법
- 자료구조
- WebClient
- CleanCode
- 연결 리스트
- 클린코드
- 스택 큐 차이
- 정렬
- 인터페이스
- 클래스
- 쿠키
- Today
- Total
Developer Cafe
퀵 정렬 vs 삽입 정렬 차이 본문
컴퓨터 정렬에서 실제로 가장 많이 쓰이는게 바로 내장 정렬 함수 퀵 정렬이다. 퀵 정렬은 매우 빠른 알고리즘으로 특히 평균 시나리오 에서 효율적이다.
분할
분할은 배열로부터 임의의 수를 가져와(이 수를 피벗이라 부름) 피벗보다 작은 모든 수는 왼쪽, 큰 수는 오른쪽에 둔다.
1 | 4 | 2 | 3 |
임의의 수 를 선택(2선택 피벗지정) 후 왼쪽 포인터(1)과 오른쪽 포인터(3)을 고른다.
1. 왼쪽 포인터를 한 셀씩 오른쪽으로 옮기면서 피벗보다 크거나 같은 값에 도달하면 멈춘다.
2. 오른쪽 포인터를 한 셀씩 왼쪽으로 옮기면서 피벗보다 작거나 같은 값에 도달하면 멈춘다.
3. 왼쪽 포인터와 오른쪽 포인터가 가리키고 있는 값을 교환한다.
4. 두 포인터가 가리키는 값이 같거나 왼쪽 포인터가 오른쪽 포인터 바로 오른쪽으로 이동할때까지 반복한다.
5. 왼쪽 포인터가 가리키는 값과 피벗값을 교환한다.
퀵 정렬
1. 분할된 배열
2. 피벗의 왼쪽과 오른쪽에 있는 하위배열을 각각 또 다른 배열로 보고 1단계와 2단계를 재귀적으로 반복한다. 즉, 각 하위 배열을 분할하고 각 하위배열에 있는 피벗의 왼쪽과 오른쪽에서 더 작아진 하위배열을 얻는다. 이어서 이러한 하위 배열을 다시 분할하는 과정을 반복한다.
3. 하위 배열이 원소를 0개 또는 1개 포함하면 기저 조건이므로 아무것도 하지 않는다.
퀵 정렬의 단계는 비교와 교환으로 나뉜다
비교는 최소 N번 비교하고, 교환은 얼마나 정렬되어 있나에 달렷는데 최소 한번 교환이며 모두 교환할지라도 왼쪽 반, 오른쪽 반 값을 교환하므로 최악일땐 N/2 교환이 일어난다.
무작위로 정렬된 데이터에 (N/2)/2 (왼, 오로 나누어 분할하니) 즉, N/4 교환이 일어난다.
비교 N + 분할 N/4 = 1.25단계고 빅 오표현에선 상수는 무시하니 O(N)단계라 말할 수 있다.
원소가 8개인 배열에서 1.25N단계를 적용하면(분할시 배열이 0 또는 1일땐 기저조건이니 수식엔 넣지않음)
8개 원소 / 1.25 단계 = 10단계
3개 원소 / 1.25 단계 = 3.75단계
4개 원소 / 1.25 단계 = 5단계
2개 원소 / 1.25 단계 = 2.5단계
합 21단계 즉, 원소 N일때 약 N*log N 단계임을 알 수 있다.
N | log N | N * log N |
4 | 2 | 8 |
8 | 3 | 24 |
16 | 4 | 64 |
여기서 최악의 시나리오일경우, 원소가 8개면 8+7+6+5+4+3+2 = 35의 분할과 35번의 비교를 한다. 즉 퀵 정렬은 O(N^2)라고도 할 수 있다.
삽입정렬
퀵 정렬 vs 삽입 정렬 차이
최선의 시나리오 | 평균 시나리오 | 최악의 시나리오 | |
삽입 정렬 | O(N) | O(N^2) | O(N^2) |
퀵 정렬 | O(N log N) | O(N log N) | O(N^2) |
최악의 시나리오 삽입=퀵
최선의 시나리오 삽입>퀵
평균의 시나리오 삽입<퀵
현실적으론 평균의 시나리오가 훨씬 많이 일어나기에 퀵 정렬이 더 우수하다 말할 수 있다.
퀵 셀렉트
퀵 정렬은 배열을 반으로 나눌 때마다 원래 배열의 모든 셀을 다시 분할해야하므로 O(N log N)이 걸린다.
그러나 퀵 셀렉트는 배열을 반으로 나눌 때마다 필요한 반쪽 즉, 찾고 있는 값이 있을 반쪽만 분할한다.
퀵 셀렉트의 평균 시나리오에서의 단계는 O(N)이다.
만약 원소 8개인 배열에선 8 + (8/2) + (8/2/2) = 14 단계가 걸린다.
즉, N + (N/2) + (N/4) ... = 2N 즉,(상수무시) O(N)단계이다.
'자료 구조 > 누구나 자료 구조와 알고리즘' 카테고리의 다른 글
이진 트리 (0) | 2021.03.08 |
---|---|
배열 vs 연결 리스트 차이 그리고 노드, 이중 연결 리스트 (0) | 2021.03.07 |
재귀 알고리즘 (0) | 2021.03.07 |
스택 vs 큐 차이 (0) | 2021.03.06 |
해시 테이블의 컴퓨팅 사고 (0) | 2021.03.06 |