快排
1.递归快排
def quick_sort(arr, start, end):
if start >= end:
return
left, right, mid = start, end, arr[start]
while left < right:
while left < right and arr[right] >= mid:
right -= 1
arr[left] = arr[right]
while left < right and arr[left] < mid:
left += 1
arr[right] = arr[left]
arr[left] = mid
quick_sort(arr, start, left-1)
quick_sort(arr, left+1, end)
return arr
2.非递归快排
利用list存储每次的上下限,类似树的层次遍历。空间复杂度O(w),w为二叉树的宽度
def quick_sort_loop(arr):
index_list = [[0, len(arr)-1]]
while index_list:
index = index_list.pop()
left, right, mid = index[0], index[1], arr[index[0]]
while left < right:
while left < right and arr[right] >= mid:
right -= 1
arr[left] = arr[right]
while left < right and arr[left] < mid:
left += 1
arr[right] = arr[left]
arr[left] = mid
if left-1 > index[0]:
index_list.append([index[0], left-1])
if index[1] > left + 1:
index_list.append([left+1, index[1]])
return arr