在一个数组中随便找数组中的一个数,比其小的数放到左侧,比其大的数放到右侧
1.最基础的快速排序
设置两个指针,挑一个数为‘基数’(一般为第一个数字),用x将其记录,right指针从右到左移动,left指针从左到右移动,先用右指针对应的值和基数比较,当其比基数小的时候,将基数的值和右指针对应的值进行交换(相反直接移动右指针),然后移动左指针,对应值和基数进行对比,当其比基数大的时候,将right对应的值和left 对应的值进行交换,直到right和left相等的时候,将其对应的值变为x利用列表的可变性
def quick_sort(array, first, end):
"""快速排序"""
if first >= end:
return
low = first
high = end
primary = array[first]
while low < high:
while low < high:
if primary <= array[high]:
high -= 1
else:
array[low] = array[high]
break
low += 1
while low < high:
if primary > array[low]:
low += 1
else:
array[high] = array[low]
break
array[high] = primary
quick_sort(array, first, high-1)
quick_sort(array, high+1, end)
if __name__ == "__main__":
lis = [49, 38, 65, 97, 76, 13, 27, 49]
quick_sort(lis, 0, len(lis) - 1)
print(lis)
# 最优时间复杂度:O(nlogn)
# 最坏时间复杂度:O(n2)
2.改进后的快排
def quickSort(array, first, end):
# 改进后的快速排序
if array is None or len(array) < 2:
return
left = first-1
right = end
cur = first
while cur+1 == right:
if array[cur] < array[end]:
array[left + 1], array[cur] = array[cur], array[left + 1]
left += 1
cur += 1
elif array[cur] == array[end]:
cur += 1
else:
array[right-1], array[cur] = array[cur], array[right-1]
right -= 1
array[end], array[right] = array[right], array[end]
quickSort(array[:left], 0, len(array) - 1)
quickSort(array[:left], 0, len(array) - 1)
if __name__ == "__main__":
lis = [49, 38, 65, 97, 76, 13, 27, 49]
quickSort(lis, 0, len(lis) - 1)
print(lis)
3.荷兰国旗问题(用快排)
def holland(array):
left, cur, right = -1, 0, len(array) - 1
end = len(array) - 1
for i in range(2):
while cur < right:
if array[cur] > array[end]:
array[cur], array[right-1] = array[right-1], array[cur]
right -= 1
elif array[cur] < array[end]:
array[cur], array[left+1] = array[left+1], array[cur]
left += 1
cur += 1
else:
cur += 1
array[end], array[cur] = array[cur], array[end]
left, cur, right = left, left+1, len(array[left+1:]) - 1
end = len(array[left+1:]) - 1
return array
a = [0,2,1,2,2,1,1,0,2,1,0]
print(holland(a))
更多详情请点击