1.快速排序/划分排序法:
快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为较小和较大的2个子序列,然后递归地排序两个子序列。
时间复杂度:O(nlgn)
步骤为:
- 挑选基准值:从数列中挑出一个元素,称为"基准"(pivot);
- 分割:重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。在这个分割结束之后,对基准值的排序就已经完成;
- 递归排序子序列:递归地将小于基准值元素的子序列和大于基准值元素的子序列排序。
1.1选取第一个元素为基准元素
arr=[1,3,11,15,12,14,5]
def quick(arr,s,t):
if s<t:
i,j=s,t-1
while True:
while arr[i]<arr[s] and i<t:
i += 1
while arr[j]>arr[s] and j>s:
j -= 1
if i<j:
arr[i],arr[j]=arr[j],arr[i]
# print("1",arr)
else:
break
arr[s],arr[j]=arr[j],arr[s]
# print("2",arr)
quick(arr,s,j)
quick(arr,j+1,t)
quick(arr,0,len(arr))
1.2选取最后一个元素为基准元素
arr=[1,3,11,15,12,14,5]
def partition(arr,s,t):
x=arr[t]
i=s-1
for j in range(s,t):
if arr[j]<x:
i+=1
arr[i],arr[j]=arr[j],arr[i]
arr[i+1],arr[t]=arr[t],arr[i+1]
return i+1
def quicksort(arr,s,t):
if s<t:
q=partition(arr,s,t)
quicksort(arr,s,q-1)
quicksort(arr,q+1,t)
quicksort(arr,0,len(arr)-1)
print(arr)
1.3随机选取一个元素为基准元素
import random
arr=[1,3,11,15,12,14,5]
def partition(arr,s,t):
x=arr[t-1]
i=s-1
for j in range(s,t):
if arr[j]<x:
i+=1
arr[i],arr[j]=arr[j],arr[i]
arr[i+1],arr[t-1]=arr[t-1],arr[i+1]
return i+1
def random_partition(arr,s,t):
i=random.randrange(s,t)
arr[i],arr[t]=arr[t],arr[i]
return partition(arr,s,t)
def quicksort(arr,s,t):
if s<t:
q=random_partition(arr,s,t)
quicksort(arr,s,q-1)
quicksort(arr,q+1,t)
quicksort(arr,0,len(arr)-1)
print(arr)