개발블로그
Published 2020. 9. 28. 01:06
퀵 정렬(Quick sort) 알고리즘

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

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

 

2. 어떻게 코드로 만들까?

 

연습 - 리스트를 리스트 슬라이싱(예 [:2])를 이용해서 세 개로 짤라 각 리스트 변수에 넣고 출력해보기

1. 피봇 선택 (보통 맨 앞에 있는 데이터 선택)
2. 분류 => 작은 데이터, pivot, 큰 데이터
3. pivot 선택, 분류하기 (데이터 수가 1개가 될 때까지)
4. 합치기 (return ...)
def qsort(list):	#pivot 선정 ~ 분류
	pivot = list[0]
    for n in range(1, len(list)):
    	if pivot > list[n] : left.append(list[n])
        else: right.append(list[n])
        
def qsort(list):	#데이터가 1개일 때 recursive call 적용 두번째 부터 pivot 기준 분류
	if len(list) <= 1:return list
    for n in range(1, len(list)):
    	if pivot > list[n]:left.append(list[n])
        else : right.append(list[n])
    return qsort(left) + [pivot] + qsort(right) # recursive call 적용

코드로 작성

def qsort(data):
    if len(data) <= 1:
        return data
    left, right = list(), list()
    pivot = data[0]

    for index in range(1, len(data)):
        if pivot > data[index]:
            left.append(data[index])
        else :
            right.append(data[index])
    #pivot 그냥 쓰면 리스트와 숫자를 더하는 셈이라 리스트로 만들어 준것
    return qsort(left) + [pivot] + qsort(right) 
import random
data_list = random.sample(range(100), 10)
qsort(data_list)

출력 : [22, 28, 52, 53, 58, 62, 64, 81, 89, 90]

 

파이썬 list comprehension 사용해서 작성해보기

def qsort(data):
    if len(data) <= 1:
        return data
    pivot = data[0]

    left = [item for item in data[1:] if pivot > item] # pivot보다 작은 item만 left에 넣기
    right = [item for item in data[1:] if pivot <= item]

    return qsort(left) + [pivot] + qsort(right) 

 

4. 알고리즘 분석

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

'알고리즘' 카테고리의 다른 글

이진 탐색(Binary Search)  (0) 2020.10.01
병합 정렬(Merge sort)  (0) 2020.10.01
동적 계획법(Dynamic Programming)과 분할 정복(Divide and Conquer)  (0) 2020.09.28
재귀 용법  (0) 2020.09.24
공간복잡도  (0) 2020.09.19
profile

개발블로그

@ORIONPOINT

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그