Notice
Recent Posts
Recent Comments
Link
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Archives
Today
Total
관리 메뉴

Seung-MinJi

[알고리즘] 퀵정렬 본문

Computer Science

[알고리즘] 퀵정렬

지승민 2023. 9. 12. 19:46

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

- 정렬 알고리즘의 꽃

- 기준점(PIVOT)을 정해서 기준점보다 작은 데이터는 왼쪽, 큰 데이터는 오른쪽으로 모으는 함수를 작성함

- 각 왼쪽, 오른쪽은 재귀용법을 사용해서 다시 동일 함수를 호출하여 위 작업을 반복함

- 함수는 왼쪽 + 기준점 + 오른쪽을 리턴함

 

2. 알고리즘 구현

Quicksort 함수 만들기

만약 리스트 갯수가 한개이면 해당 리스트 리턴

- 그렇지 않다면, 리스트 맨 앞의 데이터를 기준점으로 놓기

- left,right 리스트 변수를 만들고

- 맨 앞의 데이터를 뺀 나머지 데이터를 기준점과 비교(pivot)

 - 기준점보다 작으면 left.append(해당데이터)

 - 기준점보다 작으면 left.append(해당데이터)

- return quicksort(left)+ pivot + quicksort(right)로 재귀 호출

import random

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])
    
    return qsort(left) + [pivot] + qsort(right)
    
    
data_list = random.sample(range(100), 10)
qsort(data_list)

파이썬 comprehension을 이용해서 깔끔하게 작성

def qsort(data):
	if len(data) <= 1:
    	return data
    
    pivot = data[0]
    left = [item for item in data[1:] if pivot > item]
    right = [item for item in data[1:] if pivot <= item]
    
    return qsort(left) + [pivot] + qsort(right)
    
import random

data_list = random.sample(range(100),10)
qsort(data_list)

 

3. 알고리즘 분석

- 병합정렬과 유사, 시간복잡도는 O(n logn)

 - 단, 최악의 경우

   - 맨 처음 pivot이 가장 크거나, 가장 작으면

   - 모든 데이터를 비교하는 상황이 나옴

   - O(n^2)

'Computer Science' 카테고리의 다른 글

[알고리즘] 이진 탐색  (0) 2023.09.14
[알고리즘] 병합정렬  (0) 2023.09.12
[알고리즘] 동적 계획법과 분할 정복  (0) 2023.09.12
[알고리즘] 재귀 용법  (1) 2023.09.08
[알고리즘] 공간 복잡도  (0) 2023.09.08