일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 탐색
- git hub
- 재귀 함수
- 유닉스
- 분할 정복
- 그래프
- 스택
- Git
- 트리
- 백준
- 문법
- UNIX
- NQueen
- 정렬
- 자기개발
- 자료구조
- 파이썬
- 순차 탐색
- 그리디
- sys.stdin.readline()
- 우분투
- MiniHeap
- type 함수
- 배열
- 동적 계획
- 기초
- 이진 탐색
- 알고리즘
- format 메서드
- IT
Archives
- Today
- Total
코딩고치
[파이썬][알고리즘] 퀵 정렬 (분할 정복) 본문
퀵 정렬 (quick sort)
퀵 정렬
- 정렬 알고리즘의 핵심.
- 기준점 (pivot)을 정해서 pivot보다 작은 데이터는 왼쪽으로, 큰 데이터는 오른쪽으로 모으는 함수를 작성한다.
- 각 왼쪽, 오른쪽으로 모인 수는 재귀 함수를 이용하여 위 과정을 반복한다.
pivot 설정
나누기
왼쪽 오른쪽에서 각각 반복
합치기
알고리즘 작성
def qsort(list_num):
if len(list_num) <= 1:
return list_num
left, right = list(), list()
pivot = list_num[0]
for i in range(1, len(list_num)):
if pivot > list_num[i]:
left.append(list_num[i])
else:
right.append(list_num[i])
return qsort(left) + [pivot] + qsort(right)
import random
list_num = random.sample(range(100), 10)
qsort(list_num)
[1, 3, 9, 15, 17, 38, 41, 62, 90, 96]
def qsort(list_num):
if len(list_num) <= 1:
return list_num
pivot = list_num[0]
left = [num for num in list_num[1:] if pivot > num]
right = [num for num in list_num[1:] if pivot < num]
return qsort(left) + [pivot] + qsort(right)
import random
list_num = random.sample(range(100), 10)
qsort(list_num)
[13, 26, 43, 50, 53, 68, 73, 75, 87, 91]
- 시간 복잡도: O($nlogn$)
- 최악의 경우 O($n^2$)
- 제일 처음 pivot이 가장 크거나 가장 작은 경우
- 최악의 경우 O($n^2$)
'파이썬 > 알고리즘' 카테고리의 다른 글
[파이썬][알고리즘] 이진 탐색 (0) | 2020.05.06 |
---|---|
[파이썬][알고리즘] 병합 정렬 (0) | 2020.05.06 |
[파이썬][알고리즘] 동적 계획법과 분할 정복 (0) | 2020.05.03 |
[파이썬][알고리즘] 재귀 함수 (0) | 2020.05.02 |
[파이썬][알고리즘] 공간 복잡도 (0) | 2020.04.30 |
Comments