快排思路:
用其中一个元素作为枢轴,通过一次排序,把序列分为左右两个序列,其中左序列均小于枢轴,右序列均大于枢轴,重复这个过程。
python实现(递归):
# 双边循环法
def AdjustPartition(list1,low,high):
if low < high:
left,right = low,high
pivot = list1[left]
while left < right:
while left < right and list1[right] >= pivot:
right = right - 1
list1[left] = list1[right]
while left < right and list1[left] <= pivot:
left = left + 1
list1[right] = list1[left]
list1[left] = pivot
AdjustPartition(list1,low,left-1)
AdjustPartition(list1,left+1,high)
lis = [9,5,7,9,12,19,5,8]
AdjustPartition(lis,0,len(lis)-1)
lis
# 单边循环法
def AdjustPartition(list1,low,high):
if low < high:
pivot = list1[low]
p = low
for i in range(low + 1,high+1):
if list1[i] < pivot:
p = p + 1
list1[p],list1[i] = list1[i],list1[p]
list1[low],list1[p] = list1[p],list1[low]
AdjustPartition(list1,low,p-1)
AdjustPartition(list1,p+1,high)
lis = [9,5,7,9,12,19,5,8]
AdjustPartition(lis,0,len(lis)-1)
lis
python(非递归)
def AdjustPartition(list1,low,high):
pivot = list1[low]
p = low
for i in range(low + 1,high+1):
if list1[i] < pivot:
p = p + 1
list1[p],list1[i] = list1[i],list1[p]
list1[low],list1[p] = list1[p],list1[low]
return p
def main(list1,low,high):
re = []
re.append((low,high)) # low是开始,high是结束
while len(re) > 0:
left,right = re.pop()
p = AdjustPartition(list1,left,right)
if((p - 1) > left):
re.append((low,p - 1))
if((p + 1) < right):
re.append((p + 1,high))
lis = [9,5,7,9,12,19,5,8]
main(lis,0,len(lis)-1)
lis