Python:: 정렬 - 퀵 정렬

2022. 3. 15. 18:10·Problem Solving/이론
반응형

퀵 정렬

위키백과 퀵정렬

호어 분할 방식 기준 퀵 정렬 (위키 백과)


1. 리스트 가운데서 하나의 원소를 고른다. 이렇게 고른 원소를 피벗이라고 한다.
2. 피벗 앞에는 피벗보다 값이 작은 모든 원소들이 오고, 피벗 뒤에는 피벗보다 값이 큰 모든 원소들이 오도록 피벗을 기준으로 리스트를 둘로 나눈다. 이렇게 리스트를 둘로 나누는 것을 분할이라고 한다. 분할을 마친 뒤에 피벗은 더 이상 움직이지 않는다.
3. 분할된 두 개의 작은 리스트에 대해 재귀(Recursion)적으로 이 과정을 반복한다. 재귀는 리스트의 크기가 0이나 1이 될 때까지 반복된다.

2번 '분할을 마친 뒤에 피벗은 더 이상 움직이지 않는다.'를 보면 퀵 정렬은 매 단계에서 적어도 1개의 원소가 자기 자리를 찾게 됨을 알 수 있다.

 

<참고 코드>

이것이 취업을 위한 코딩 테스트다 with 파이썬 - 6.4py

https://github.com/ndb796/python-for-coding-test/blob/master/6/4.py

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)
print(array)

 

(파이썬의 장점을 살린 퀵 정렬 소스코드)

이것이 취업을 위한 코딩 테스트다 with 파이썬 - 6.5py

https://github.com/ndb796/python-for-coding-test/blob/master/6/5.py

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:] # 피벗을 제외한 리스트

    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)

print(quick_sort(array))

피벗과 데이터를 비교하는 비교 연산 횟수가 증가하므로 시간 면에서는 조금 비효율적임

반응형

'Problem Solving > 이론' 카테고리의 다른 글

Python :: 최단 경로 - A* 알고리즘  (2) 2022.05.14
Python:: 정렬 - 힙 정렬  (0) 2022.03.15
Python:: 정렬 - 삽입 정렬  (0) 2022.03.15
Python:: 정렬 - 선택 정렬  (1) 2022.03.15
Python:: 탐색 알고리즘 DFS/BFS  (0) 2022.02.17
'Problem Solving/이론' 카테고리의 다른 글
  • Python :: 최단 경로 - A* 알고리즘
  • Python:: 정렬 - 힙 정렬
  • Python:: 정렬 - 삽입 정렬
  • Python:: 정렬 - 선택 정렬
나귀당
나귀당
게임 클라이언트 개발자의 개인 블로그 (기술, 개발일지, 성찰)
  • 나귀당
    나귀라 카더라
    나귀당
    • 분류 전체보기 (170)
      • 개발 (26)
        • 게임 (9)
        • 서브 (9)
        • 기타 (8)
      • Computer Science (20)
        • 머신러닝 (5)
        • 정보보안 (6)
        • 컴퓨터비전 (8)
        • 컴퓨터그래픽스 (1)
      • Problem Solving (52)
        • 이론 (17)
        • 문제풀이 (32)
        • 기타 (3)
      • 개인 (57)
        • Careers (1)
        • 회고+계획 (35)
        • 후기 (14)
        • 좌충우돌 (2)
        • 독서 (5)
      • 학교 (업뎃X) (15)
        • 과제 (2)
        • 수업관련 (9)
  • 반응형
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
나귀당
Python:: 정렬 - 퀵 정렬
상단으로

티스토리툴바