基本思想:divide & conquer and partition - 把array分成>=pivot和<pivot(=随意)两部分
重点:
1.while l<r -> 最终l等于r
2.因为最终start与l交换位置,l必须指向一个小于pivot的数 -> if else的顺序不能变
Partitions
def partitionSwap(arr, start, end):
pivot = arr[start]
l, r = start, end
while l<r:
if arr[r]>pivot: r -= 1
elif arr[l]<=pivot: l += 1
else: arr[l], arr[r] = arr[r], arr[l]
arr[l], arr[start] = arr[start], arr[l]
return l
def partitionTianKen(arr, start, end):
pivot = arr[start]
l, r = start, end
while l<r:
while l<r and arr[r]>pivot: r-=1
arr[l], arr[r] = arr[r], arr[l]
while l<r and arr[l]<=pivot: l+=1
arr[l], arr[r] = arr[r], arr[l]
return l
def partitionSeq(arr, start, end):
pivot = arr[end]
for i in range(start, end, 1):
if arr[i]<pivot:
arr[start], arr[i] = arr[i], arr[start]
start += 1
arr[end], arr[start] = arr[start], arr[end]
return start
Basics: divide & conquer
def quickSort(arr, start, end, partition):
if start>=end: return
pivotPosition = partition(arr, start, end)
quickSort(arr, start, pivotPosition-1, partition)
quickSort(arr, pivotPosition+1, end, partition)
QuickSort with 3-way Partition
Reference:
https://segmentfault.com/a/1190000004410119#articleHeader1