티스토리 뷰
퀵 정렬(Quick Sort)
퀵 정렬(Quick Sort) 이란?
퀵 정렬은 평균적으로 매우 빠른 수행속도를 자랑하는 정렬 방법으로 분할정복(Divide and Conquer) 알고리즘이다.
퀵 정렬은 불안정 정렬에 속하며, 다른 원소와의 비교만으로 정렬을 수행하는 비교 정렬에 속한다. 또한 병합 정렬과는 다르게 퀵 정렬은 배열을 비 균등하게 분할한다.
분할(Divide) → 정복(Conquer) → 결합(Combine)
퀵 정렬은 pivot 을 선정하여 pivot 을 기준으로 좌측과 우측으로 pivot 보다 작은 값은 왼쪽 pivot 보다 큰 값은 오른쪽으로 재배치를 하고 계속해서 분할하여 정렬하는 알고리즘이다.
* 분할정복(Divide and Conquer)
문제를 작은 2개의 문제로 분리하고 각각을 해결한 다음, 결과를 모아서 원래의 문제를 해결하는 전략이다.
퀵 정렬(Quick Sort) 알고리즘의 구체적인 개념
하나의 리스트를 피벗(pivot)을 기준으로 두 개의 비 균등한 크기로 분할하고 분할된 부분 리스트를 정렬한 다음, 두 개의 정렬된 부분 리스트를 합하여 전체가 정렬된 리스트가 되게 하는 방법이다.
퀵 정렬은 다음 단계들로 이루어진다.
- 분할(Divide): 입력 배열을 피벗을 기준으로 비 균등하게 2개의 부분 배열로 분할한다. (왼쪽 - 피벗보다 작은 요소들, 오른쪽 - 피벗보다 큰 요소들)
- 정복(Conquer): 부분 배열을 정렬한다. 부분 배열의 크기가 충분히 작지 않으면 순환 호출을 이용하여 다시 분할 정복 방법을 적용한다.
- 결합(Combine): 정렬된 부분 배열들을 하나의 배열에 합병한다.
- 순환 호출이 한번 진행될 때마다 최소한 하나의 원소(피벗)은 최종적으로 위치가 정해지므로 이 알고리즘은 반드시 끝난다는 걸 보장할 수 있다.
예제
퀵 정렬(Quick Sort) 시간 복잡도
1. 최선의 경우
T(n) = O(nlog n)
2. 최악의 경우
T(n) = O(n^2)
3. 평균
T(n) = O(nlogn)
퀵 정렬(Quick Sort) 단점
partition() 함수에서 피벗 값이 최소나 최대값으로 지정되어 파티션이 나누어지지 않았을 때, O(n^2)에 대한 시간 복잡도를 가진다.
즉, 정렬하고자 하는 배열이 오름차순 정렬 되어있거나 내림차순 정렬 되어있으면 O(n^2)의 시간 복잡도를 가진다.
코드(Python)
array =[5,7,9,0,3,1,6,2,4,8]
def quick_sort(array,start,end):
if start>= end: # 원소가 1개인 경우 종료
return
pivot = start # pivot 은 첫 번째 원소
left = start + 1
right = end
while left<=right:
# 피벗보다 큰 데이터를 찾을 때까지 반복
while left<=end and array[left]<=array[pivot]:
left +=1
while right>start and array[right]>= array[pivot]:
right-=1
if left>right: #엇갈렸다면 작은 데이터와 피벗을 교체
array[right],array[pivot]= array[pivot],array[right]
else: #엇갈리지 않았다면 작은 데이터와 큰 데이터를 교체
array[left],array[right]=array[right],array[left]
#분할 이후 왼쪽 부분과 오른쪽 부분에서 각각 다시 정렬 수행
quick_sort(array, start,right-1)
quick_sort(array,right+1,end)
quick_sort(array,0,len(array)-1)
print(array)
'Study > CS' 카테고리의 다른 글
[알고리즘] 계수 정렬(Counting Sort) (0) | 2022.08.13 |
---|---|
[데이터베이스] 조인(Join) (0) | 2022.08.07 |
[데이터베이스] 레디스(Redis) (0) | 2022.07.31 |
[알고리즘] 삽입 정렬(Insertion Sort) (0) | 2022.07.31 |
[운영체제] 세마포어(Semaphore)와 뮤텍스(Mutex) (0) | 2022.07.23 |
- Total
- Today
- Yesterday
- 리스트
- 완전탐색
- 자료구조와알고리즘 23강
- https
- CS 스터디
- It
- 리스트 복사
- 프로그래머스강의
- 연결리스트활용
- 정렬
- 네트워크
- 보험
- 리스트함축
- CS.
- 데이터베이스
- 알고리즘
- 운영체제
- 프로그래머스
- 이진탐색
- SW
- 파이썬
- CS
- 프로세스 주소공간
- Greedy sort
- 코드업 기초
- 자료구조
- 스터디
- 이차 리스트
- 리스트2
- 자바
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |