test_list = [3, 5, 65, 7, 45, 23, 33, 22, 11, 22, 11, 5]
def quick_sort(sort_list):
if len(sort_list) < 2:
return sort_list
pivot = sort_list[len(sort_list) // 2]
less_list, equal_list, greater_list = [], [] , []
for i in sort_list:
if i < pivot:
less_list.append(i)
elif i == pivot:
equal_list.append(i)
else:
greater_list.append(i)
return quick_sort(less_list) + equal_list + quick_sort(greater_list)
print(quick_sort(test_list))
퀵정렬의 결과는
# 정렬 결과
[3, 5, 5, 7, 11, 11, 22, 22, 23, 33, 45, 65]
위의 정렬 방식은 간단하면서도 재귀함수를 사용하는 방식의 문제풀이 방법이다, 하지만 입력이 커지면 커질수록 피벗값보다 작은 리스트, 같은 리스트, 큰 리스트들을 만들고 그 리스트들 안에서 또 작고 큰 리스트를 생성해야 하기 때문에 메모리의 비효율 성을 낳게 됩니다. 그러므로 메모리를 적게 사용하는 inplace 형식의 sort방법을 알아봅시다.
test_list = [3, 5, 65, 7, 45, 23, 33, 22, 11, 22, 11, 5]
def quick_sort(sorting_list):
left = 0
right = len(sortin_list) - 1
return sort(sorting_list, left, right)
def sort(sorting_list, left, right):
if left >= right:
return
pivot = (left + right) // 2
low, high = left, right
while low <= high:
while sorting_list[low] < sorting_list[pivot]:
low += 1
while sorting_list[high] > sorting_list[pivot]:
high -= 1
if low <= high:
sorting_list[low], sorting_list[high] = sorting_list[high], sorting_list[low]
low += 1
high -= 1
sort(sorting_list, left, high)
sort(sorting_list, low, right)
return sorting_list
print(quick_sort(test_list))
퀵정렬의 결과는
# 정렬 결과
[3, 5, 5, 7, 11, 11, 22, 22, 23, 33, 45, 65]
위의 값과 똑같이 나왔지만 이는 공간복잡도적인 측면에서 메모리를 덜쓴다는 점이 있다.