1) 피벗 선택
2) 분할 과정
3) 결합 과정
4) 재귀 호출
import sys
input = sys.stdin.readline
def QuickSort(arr, start, end):
# 원소가 한 개인 경우 종료
if start >= end:
return
# 피벗값을 배열의 맨 처음 원소로 설정
pivot = start
left = start + 1
right = end
# 왼쪽 인덱스가 오른쪽 인덱스보다 작으면 계속 진행(넘어서면 종료)
while left <= right:
# 피벗보다 큰 데이터를 배열의 인덱스 범위 내에서 찾는다.
# 배열의 왼쪽 인덱스값 1증가
while left <= end and arr[left] <= arr[pivot]:
left += 1
# 피벗보다 작은 데이터를 배열의 인덱스 범위 내에서 찾는다.
# 배열의 오른쪽 인덱스값 1감소
while right > start and arr[right] >= arr[pivot]:
right -= 1
# 인덱스 값이 엇갈렸다면?
# 피벗값과 오른쪽 인덱스 값 교체
if left > right:
arr[right], arr[pivot] = arr[pivot], arr[right]
# 인덱스 값이 엇갈리지 않았다면?
# 왼쪽, 오른쪽 인덱스 값 교체
else:
arr[left], arr[right] = arr[right], arr[left]
QuickSort(arr, start, right-1)
QuickSort(arr, right+1, end)
arr = [8,9,3,1,2,5,7,10]
print("Before Sort: ", end=" ")
print(arr)
QuickSort(arr, 0, len(arr)-1)
print("After Sort: ", end=" ")
print(arr)