#快排是基于荷兰国旗问题扩展的
# 快排1.0------时间复杂度:最差O(n**2)
# 保证最后一个数为区分数,保证不动,利用荷兰国旗问题排序,然后把最后一个值和大于区域的
#最后一个值交换,然后这个值左右两边分别进行递归
# 快排2.0
# 数组中最后一个数做划分值,<p ==p >p 直接把等于p的那一批都搞定了
#时间复杂度:最差O(n**2)
#最好:左右两边数差不多T(n) = 2(N/2) + O(N)
# 快排3.0———————时间复杂度:最差O(n*logN)
# 随机快排,快排的本体
# [L...R]等概率随机选择一个数,放在最后,然后做划分值
# 好坏情况各占1/N,数学证明得到时间复杂度O(n*logN)
import random
def swap(arr,i,j):
tmp = arr[i]
arr[i] = arr[j]
arr[j] = tmp
def partition(arr,L,R):
less = L -1
more = R
index = L
while(index<more):
if arr[index]<arr[R]:
swap(arr,index,less+1)
less +=1
index +=1
elif arr[index]>arr[R]:
swap(arr,index,more-1)
more -=1
else:
index += 1
swap(arr, more, R)
return [less+1,more]
def quickSort(arr,l,r):
res = []
if(l<r):
# 找到一个随机数,然后与数组的最后一个数交换
swap(arr,l+random.randint(0,r-l),r)
#partition
print('获取随机划分点{}'.format(arr))
res = partition(arr,l,r)
quickSort(arr,l,res[0]-1)
quickSort(arr,res[0]+1,r)
def mian(arr):
size = len(arr)
if size<2:
print(arr)
quickSort(arr,0,size-1)
if __name__ == '__main__':
arr = [1, 9, 2, 8, 6, 7, 2, 0, 1, 7]
print(arr)
mian(arr)
print(arr)
快排——基于荷兰国旗问题
最新推荐文章于 2023-01-31 07:30:00 发布