1 분 소요

1. 퀵 정렬 (quick sort) 이란?

  • 정렬 알고리즘의 꽃
  • 기준점(pivot 이라고 부름)을 정해서, 기준점보다 작은 데이터는 왼쪽(left), 큰 데이터는 오른쪽(right) 으로 모으는 함수를 작성함
  • 각 왼쪽(left), 오른쪽(right)은 재귀용법을 사용해서 다시 동일 함수를 호출하여 위 작업을 반복함
  • 함수는 왼쪽(left) + 기준점(pivot) + 오른쪽(right) 을 리턴함

2. 알고리즘 구현

quicksort 함수 만들기

  • 만약 리스트 갯수가 한개이면 해당 리스트 리턴
  • 그렇지 않으면, 리스트 맨 앞의 데이터를 기준점(pivot)으로 놓기
  • left, right 리스트 변수를 만들고,
  • 맨 앞의 데이터를 뺀 나머지 데이터를 기준점과 비교(pivot)
    - 기준점보다 작으면 left.append(해당 데이터)
    - 기준점보다 크면 right.append(해당 데이터)
  • return quicksort(left) + pivot + quicksort(right) 로 재귀 호출

리스트로 만들어서 리턴하기: return quick_sort(left) + [pivot] + quick_sort(right)

프로그래밍 연습

def qsort(data):
    if len(data) <= 1:
        return data
    
    left, right = list(), list()
    pivot = data[0]
    
    for i in range(1, len(data)):
        if data[i] < pivot:
            left.append(data[i])
        else:
            right.append(data[i])
            
    return qsort(left) + [pivot] + qsort(right) # [pivot] 형태로 리스트로 만들어서 합쳐야 한다.
코드 이미지

스크린샷 2022-10-03 오전 1 26 50

테스트

스크린샷 2022-10-03 오전 1 27 03

위 퀵정렬 코드를 파이썬 list comprehension을 사용해서 더 깔끔하게 작성해보기

🌟 파이썬 Comprehension을 잘 모른다면, 이 사이트를 참고하자!

# 파이썬의 list comprehension 사용

def qsort(data):
    if len(data) <= 1:
        return data
    
    pivot = data[0]
    
    left = [x for x in data[1:] if x < pivot]
    right = [x for x in data[1:] if x >= pivot]
            
    return qsort(left) + [pivot] + qsort(right) # [pivot] 형태로 리스트로 만들어서 합쳐야 한다.
코드 이미지

스크린샷 2022-10-03 오전 1 35 32

테스트

스크린샷 2022-10-03 오전 1 35 50


3. 알고리즘 분석

  • 병합정렬과 유사, 시간복잡도는 $O(nlogn)$
  • 단, 최악의 경우
    - 맨 처음 pivot이 가장 크거나, 가장 작으면
    - 모든 데이터를 비교하는 상황이 나옴
    - $O(n^2)$

스크린샷 2022-10-03 오전 1 43 00



💛 개인 공부 기록용 블로그입니다. 👻

맨 위로 이동하기