partition函数就是快排的关键部分,作用是将数组划分成两部分,左边小于基数,右边大于基数
但实际上它也不仅仅用于快排,在求top(K)问题中也常常会用到。
下面介绍两种partition函数,他们都是双指针的方法,但具体会有差异:
函数一:头尾指针向中间夹
def partition(array,left,right):
baseNumber = array[left] # 基数的位置也可以随机取,避免有序列表导致最坏的复杂度
while left<right:
while left < right and baseNumber <= array[right]:
right -= 1
array[left] = array[right] # 这一步之后不用再 left += 1,因为下面的循环第一次肯定满足
while left < right and baseNumber >= array[left]:
left += 1
array[right] = array[left]
array[left] = baseNumber
return left
函数二:双指针都从头开始
第二种partitition函数,也是双指针,但都是从头开始,一个占坑(记录下一个要替换的位置),一个遍历,同样要选择基准值,实际上也可以以任何一个元素作为基准值,下面以第一个元素作为基准值:
def partition(array, left, right):
baseNumber = array[left]
x = left
for y in range(left, right):
if array[y]<baseNumber:
x+=1
array[x], array[y] = array[y],array[x]
array[x], array[left] = array[left], array[x]
return x
def quich_sort(a, left, right):
if left<right:
index = partitionA(a, left, right)
quich_sort(a,left, index-1)
quich_sort(a, index+1, right)
a=[4,1,3,2,-3,6]
quich_sort(a, 0, len(a))
print(a)
这个partition函数不需要知道数组的长度,是从头到尾遍历过去的,因此也可以用于链表的快排:链表的快排和归并排序