일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- WebOS
- py
- 컴퓨터비전
- level1
- 자바
- level3
- 파이썬
- SWEA
- Matrix Factorization
- level4
- build
- 대학원일기
- Python
- D3
- 컨트리뷰톤
- git
- Github
- 안드로이드스튜디오
- BFS
- 대학원
- java
- 프로그래머스
- SQL
- LEVEL2
- 어렵다
- 휴학
- androidstudio
- 다시풀기
- MSBuild
- 내휴학생활중의아주큰일
Archives
- Today
- Total
bit가 눈 앞에서 왔다갔다
Py) 퀵정렬 Quick Sort 본문
- 데이터 특성 상관 없이 가장 많이 사용되는 정렬 알고리즘
- 라이브러리에서 정렬함수를 호출하면 대부분 quick sort나 merge sort
- 복잡도 분석: 표준 라이브러리 이용시 항상 O(NlogN) 보장, 이상적인 경우- 왼쪽 오른쪽이 균등하게 나눠진 경우, 최악의 경우 - 편향된 경우
알고리즘
- left는 피벗보다 큰 데이터를 찾을 때까지 왼쪽에서 오른쪽으로 탐색한다
- right는 피벗보다 작은 데이터를 찾을 때까지 오른쪽에서 왼쪽으로 탐색한다
- left와 right가 엇갈릴 경우 작은 데이터와 피벗의 위치를 바꾼다
- 새롭게 생긴 두 리스트를 재귀함수로 호출해 퀵정렬을 시행한다
#데이터 특성 상관없이 일반적으로 가장 많이 사용되는 정렬알고리즘
#정렬 라이ㅣ브러리의 근간이 되는 (+병합정렬)
#기본적인 형태- 첫번째 데이터를 피봇으로
#표준라이브러리 이용시 항상 O(NlogN)보장
#이상적인 경우 - 왼쪽 오른쪽 균등하게 나눠진 경우, 최악- 편향된 경우
array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8]
def quick_sort(array, start, end):
if start >= end: #원소가 1개인 경우
return #종료
pivot = start #피벗은 첫번째 원소
left = start + 1
right = end
while(left <= right): #엇갈리기 전까지 반복
#(선형탐색- left, right 찾는)
#피벗보다 큰 데이터 찾을 때까지 반복
while(left <= end and array[left] <= array[pivot]):
left += 1
#피벗보다 작은 데이터 찾을 때까지 반복
while(right > start and array[right] >= array[pivot]):
right -= 1
#엇갈린 경우 작은 데이터와 피벗 값을 바꿈
if(left > right): #l이 r보다 클 경우
array[right], array[pivot] = array[pivot], array[right]
else: #r이 l보다 클 경우
array[left], array[right] = array[right], array[left]
#새롭게 생긴 두 리스트를 재귀로 퀵정렬 시행
quick_sort(array, start, right - 1)
quick_sort(array, right + 1, end)
quick_sort(array, 0, len(array) - 1)
print(array)
######
#리스트 슬라이싱을 이용할 경우
array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8]
def quick_sort(array):
if len(array) <= 1:
return array
pivot = array[0]
tail = array[1:] #피벗을 제외한 리스트
left = [x for x in tail if x <= pivot] #하나씩 검사하면서 피벗보다 작으면 리스트로
right = [x for x in tail if x > pivot] #하나씩 검사하면서 피벗보다 크면 리스트로
#분할하고 재귀를 이용해 각각 정렬 수행하고 리스트 반환
return quick_sort(left) + [pivot] + quick_sort(right)
print(quick_sort(array))
파이썬 최고다,,
반응형
'Algorithm > Concept' 카테고리의 다른 글
DFS, BFS 판단 기준 (0) | 2022.02.04 |
---|---|
Py) 계수정렬 Counting Sort (0) | 2021.02.17 |
Py) 삽입정렬 Insertion Sort (0) | 2021.02.17 |
Py) 선택정렬 Selection Sort (0) | 2021.02.17 |
py) BFS, DFS (0) | 2021.02.11 |
Comments