#随机选一个数 作为划分值
import random
def Quick_sort(arr):
if not arr or len(arr)<2:
return arr
quick_sort(arr,0,len(arr)-1)
return arr
def quick_sort(arr,l,r):
#递归要考虑,终止条件,作用放在那里
#因为要取得等于区域的两端的索引,所以要先获得索引
if l<r:
q = partation(arr,l,r)
quick_sort(arr,l,q[0]-1)
quick_sort(arr,q[0]+1,r)
def partation(arr,l,r):
#在数组中取一个数与最后一个数进行交换
random_choice = int(random.random()*(r-l+1))+l
arr[r],arr[random_choice] = arr[random_choice],arr[r]
num = arr[r]
less = l-1
more = r
current = l
while current<more:
if arr[current]<num:
arr[current],arr[less+1] = arr[less+1],arr[current]
current+=1
less+=1
elif arr[current]==num:
current+=1
else:
arr[current],arr[more-1] = arr[more-1],arr[current]
more-=1
arr[r],arr[more] = arr[more],arr[r]
return [less+1,more]
if __name__ == '__main__':
li = [4,5,3,7,6,5]
a = Quick_sort(li)
print(a)
时间O(nlogn)
空间O(logn)空间浪费在记录划分点是一个列表,划分几次就是几个列表 二分了logn次