猴子排序效果低劣,原代码不是很繁琐:
import random
def partition(List): #随机打乱
k=len(List)
a=random.randint(0,k-1)
b=random.randint(0,k-1)
p=List[a]
List[a]=List[b]
List[b]=p
def sort(List):
while True:
partition(List)
IS=True
for i in range(len(List)-1): #判定是否有序
if List[i]>List[i-1]:
IS=False
if IS:
break
此时,平均时间复杂度为O((n+1)!),空间复杂度为O(1)。
改进后,代码如下:
import random
def partition(start,end,List): #随机打乱
a=random.randint(start,end)
b=random.randint(start,end)
p=List[a]
List[a]=List[b]
List[b]=p
def sort(start,end,List):
if start==end:
return 0
k=None
for i in range(start,end): #分治法
max=-214748648 #左侧最大值
for j in range(start,i):
if List[j]>max:
max=List[j]
min=214748647 #右侧最小值
for j in range(i,end):
if List[j]<min:
min=List[j]
if max<min:
k=i
break
if k is not None: #分治
sort(start,k-1,List)
sort(k,end,List)
else: #排序一次
partition(start,end,List)
sort(start,end,List)
可以看出,partition小有改动,sort直接脱胎换骨!时间复杂度降为O((n^2)*log2(n)),空间复杂度升为O(log2(n))。