파이썬으로 구현하는 퀵 정렬(Qucik Sort)

2022. 3. 17. 17:28·Algorithm/자료구조

Concept

병합 정렬(Merge Sort)과 마찬가지로, 퀵 정렬은 분할 정복(Divide and Conquer) 기법과 재귀 알고리즘을 이용한 정렬 알고리즘으로, 시간복잡도는 $O(nlogn)$이다

하나의 리스트에서 피봇(pivot)이라고 불리는 임의의 기준값을 사용하여 pivot 값을 기준으로 pivot 보다 작은 값의 그룹과 큰값의 그룹으로 나눈다. 이 때 두 그룹의  각 요소들은 정렬된 상태는 아니지만, pivot은  정렬된 위치로  들어가게되며 이를 재귀호출을 통해 정렬하게 된다. 전체적인 동작 과정은 다음과 같다

퀵 정렬; 오름차순

 

구현 코드

(아래 코드는 pivot을 arr의 첫번째 요소로 잡은 코드입니다; pivot = arr[0])

1) 정렬되지 않은 데이터 -> 리스트로 입력 받기

>>>3 2 4 6 9 1 8 7 5
arr = [int(x) for x in input().split()]

2) quick sort

partition 함수는  pivot의 전체 리스트에서 정렬된 위치를 반환한다

def quick_sort(arr, i, j):
    if i < j:
    	pivot = partition(arr, i, j) # pivot의 정렬된 위치를 반환받음 
        quick_sort(arr, i, pivot-1) # pivot을 기준으로 작은 그룹
        quick_sort(arr, pivot+1, j) # pivot을 기준으로 큰 그룹

3) partition

pivot을 전체 리스트에서 정렬된 위치로 이동시켜주며, pivot을 기준으로 왼쪽은 작은 값을, 오른쪽은 큰 값을 두게 된다

def partition(arr, s, e):

    # pivot을 arr의 첫번째 원소값으로 초기화
    pivot_idx = s
    pivot = arr[pivot_idx]
    
    while s < e:
        # arr[s]가 pivot보다 크면 스탑
    	while s < len(arr) and arr[s] <= pivot: 
            s += 1
            
        # arr[e]가 pivot보다 작으면 스탑
        while arr[e] > pivot: 
            e -= 1  
            
        # s,e위치가 스왑되지 않았다면 arr[s],arr[e]를 스왑
        if s < e: 
            arr[s], arr[e] = arr[e], arr[s]
        
    # s > e 상태로 현재 e의 위치는 pivot의 정렬된 위치임
    # 따라서 arr[e], arr[pivot_idx]를 스왑
    arr[e], arr[pivot_idx] = arr[pivot_idx], arr[e]
    
    # pivot의 정렬된 위치 반환
    return e

3) 정렬결과 확인

quick_sort(arr, 0, len(arr)-1)
print(arr)
>>>1 2 3 4 5 6 7 8 9
반응형

'Algorithm > 자료구조' 카테고리의 다른 글

파이썬으로 구현하는 병합정렬(Merge Sort)  (4) 2022.03.13
파이썬으로 구현하는 덱(Deque)  (2) 2021.12.26
파이썬으로 구현하는 원형 큐(Circular Queue)  (2) 2021.12.26
[이론] 우선순위 큐 (Priority Queue)  (0) 2021.07.15
[이론] 힙(Heap)  (0) 2021.07.15
'Algorithm/자료구조' 카테고리의 다른 글
  • 파이썬으로 구현하는 병합정렬(Merge Sort)
  • 파이썬으로 구현하는 덱(Deque)
  • 파이썬으로 구현하는 원형 큐(Circular Queue)
  • [이론] 우선순위 큐 (Priority Queue)
계속지나가기
계속지나가기
NLP Engineer
  • 계속지나가기
    코딩스뮤
    계속지나가기
  • 전체
    오늘
    어제
    • 코딩스뮤:)
      • Algorithm
        • 백준 문제풀이
        • 프로그래머스 문제풀이
        • 알고리즘 이론
        • 자료구조
        • SW Expert Academy
      • 인공지능(AI)
        • LLMs
        • 자연어처리(NLP)
        • 컴퓨터비전(CV)
        • 딥러닝(DL)
        • 머신러닝(ML)
        • 인공지능기초수학
        • 선형대수학
      • 컴퓨터 세팅
      • Computer Science
        • 유닉스프로그래밍
        • 프로그래밍언어론
        • 디자인패턴
        • 클린코드
        • SW 영어
        • 리눅스
        • 논리회로
      • Server
        • Docker
  • 블로그 메뉴

    • 홈
    • Who Am I(CV)
    • 태그
  • 링크

    • 깃허브 주소
  • 공지사항

  • 인기 글

  • 태그

    에지검출
    선형회귀
    DIP
    파이썬 클린코드
    비용함수
    비지도학습
    경사하강법
    DigitalImageProcessing
    네트워크플로우
    MaximumFlow
    결정경계
    NLP
    패턴인식
    최대유량
    networkflow
    LM
    지도학습
    컴퓨터비전
    언어모델
    알고리즘
    ML
    머신러닝
    f1-score
    손실함수
    SIFT
    군집화
    기계학습
    ComputerVision
    디지털이미지처리
    machinelearning
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
계속지나가기
파이썬으로 구현하는 퀵 정렬(Qucik Sort)

티스토리툴바