계속지나가기
코딩스뮤
계속지나가기
전체 방문자
오늘
어제
  • 코딩스뮤:)
    • Algorithm
      • 백준 문제풀이
      • 프로그래머스 문제풀이
      • 알고리즘 이론
      • 자료구조
      • SW Expert Academy
    • 인공지능(AI)
      • LLMs
      • 자연어처리(NLP)
      • 컴퓨터비전(CV)
      • 딥러닝(DL)
      • 머신러닝(ML)
      • 인공지능기초수학
      • 선형대수학
    • 컴퓨터 세팅
    • Computer Science
      • 유닉스프로그래밍
      • 프로그래밍언어론
      • 디자인패턴
      • 클린코드
      • SW 영어
      • 리눅스
      • 논리회로
    • Server
      • Docker

블로그 메뉴

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

공지사항

인기 글

태그

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

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
계속지나가기

코딩스뮤

파이썬으로 구현하는 퀵 정렬(Qucik Sort)
Algorithm/자료구조

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

2022. 3. 17. 17:28
반응형

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

    티스토리툴바