728x90
- 퀵 정렬
- 주어진 배열을 두 개로 분할하고, 각각을 정렬
- 최악의 시간 복잡도 O(n^2), 합병정렬보다 좋지 못하다
- 평균적으로 가장 빠름( O(nlogn))
- 합병정렬과 다른점
- 합병정렬은 그냥 두 부분으로 나누는 반면에, 퀵정렬은 분할할 때, 기준 아이템(pivot item) 중심으로, 기준보다 작은 것은 왼쪽, 큰 것은 오른쪽으로 위치
- 각 부분 정렬이 끝난 후, 합병정렬은 합병이란 후 처리 작업이 필요하나, 퀵정렬은 필요하지 않음
def quickSort(a,begin,end):
if begin < end:
p = partition(a,begin,end)
quickSort(a,begin,p-1)
quickSort(a,p+1,end)
def partition(a,begin,end):
pivot = (begin+end)//2
L = begin
R = end
while L < R:
while (L<R and a[L] < a[pivot]):
L += 1
while (L < R and a[R] >= a[pivot]):
R -= 1
if L < R:
if L==pivot:
pivot = R
a[L], a[R] = a[R], a[L]
a[pivot], a[R] = a[R], a[pivot]
return R
a =[69,10,30,2,16,8,31,22]
quickSort(a,0,7)
print(a)
- 퀵 정렬 순서
- 중앙에 값을 pivot 으로 선택
- 범위의 시작값 L, 마지막값 R
- L >= R이 아닐때까지
- L에서 오른쪽으로 이동하면서 pivot보다 크거나 같은 값 찾기, R에서 왼쪽으로 이동하면서 pivot보다 작은 원소 찾기
- L<R 이면 (L == pivot이면 pivot = R 그리고 L값과 R값 자리 바꾸기)
작은 값을 앞으로 보내기 위해 - L =< R이면 pivot과 R(작은값) 바꾸기
- pivot 기준으로 왼쪽구간 오른쪽 구간 각각 1번부터
728x90
반응형
'TIL - 프로그래밍 > 개념, 설정' 카테고리의 다른 글
[Python] 부분집합 - 순열2 (0) | 2022.03.07 |
---|---|
[Python] 부분집합 - 순열1 (0) | 2022.03.05 |
[Python] 백트래킹 (Backtracking) 기법 (0) | 2022.02.28 |
[Python] 깊이 우선 탐색(DFS : Depth First Search) (0) | 2022.02.26 |
[Python] Fibonacci sequence (피보나치 수열) (0) | 2022.02.26 |
댓글