학/Algorithm

[정렬] 퀵 정렬(Quick Sort)

이준늬 2023. 3. 5. 15:39

- Pivot(큰 값 작은 값을 교환할 때의 기준)을 사용
- Pivot이 이동된 경우 Pivot을 기준으로 좌 우를 별개로 나눠 교환 반복
- 가장 많이 사용되는 정렬 알고리즘, 대부분의 정렬 라이브러리의 근간

 

시간 복잡도 : O(NlogN) 최악의 경우 O(N^2) - 이미 정렬된 경우, 인덱스 n(n-1, n-2 ..._)부터 Pivot까지
공간 복잡도: O(N)

 

#파이썬이 지리는 형태

array = [5, 7, 9, 0, 3, 1, 6, 2, 4, 8]

def quick_sort(array):
    #리스트가 하나 이하의 원소가 남았을 때, 종료
    if len(array) <= 1:
        return array
    
    pivot = array[0]
    tail = array[1:0]
    
    left_side = [x for x in tail if x <= pivot] #분할 중 왼쪽
    right_side = [x for x in tail if x > pivot] #분할 중 오른쪽
    
    return quick_sort(left_side) + [pivot] + quick_sort(right_side)
array = [5, 7, 9, 0, 3, 1, 6, 2, 4, 8]

def quick_sort(array, start, end):
    if start >= end: # 원소가 1개인 경우 종료
        return
    pivot = start
    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)

 

부가 설명

더보기

 

 

 엇갈리지 않은 경우: pivot보다 작은 수가 pivot보다 큰 수 앞으로 이동
 엇갈린 경우: pivot보다 작은 수는 좌측, 큰 수는 우측으로 정렬됨

 

 

 


정렬 전체가긔

이것이 코딩 테스트다 - 나동빈
정리하긔

 

 

' > Algorithm' 카테고리의 다른 글

[정렬] 계수 정렬(Count Sort)  (0) 2023.03.05
[정렬] 삽입 정렬(Insertion Sort)  (0) 2023.03.04
[정렬] 선택 정렬(Selection Sort)  (0) 2023.03.04
정렬  (0) 2023.03.04
[구현] 행렬(Matrix)  (0) 2023.02.15