首先说一下,一下算法仅限娱乐,请勿在比赛中使用!!!
算法:猴子算法
空间复杂的:O(1)
时间复杂度(最坏情况):O(n∞)
时间复杂度(最好情况):O(n)
首先我们介绍无限猴子定理
无限猴子定理最早是由埃米尔·博雷尔在1909年出版的一本谈概率的书籍中提到的,此书中介绍了“打字的猴子”的概念。无限猴子定理是概率论中的柯尔莫哥洛夫的零一律的其中一个命题的例子。大概意思是,如果让一只猴子在打字机上随机地进行按键,如果一直不停的这样按下去,只要时间达到无穷时,这只猴子就几乎必然可以打出任何给定的文字,甚至是莎士比亚的全套著作也可以打出来。
根据猴子定理,如果我们不断用随机的数字组成一个数列,那么在无限长的时间里,这个数列在某次肯定会变成有序。
关于猴子定理的实现,网上也有很多实例,但是大部分都是和上述一样,生成随机数字的数列,然后验证是否有序,我觉得这样实际上并不一种排序,我理解的排序就是对现有的数列进行排序,因此实现时做了一定的改造
给出一个固定的乱序数列 随机从这个乱序数列中取出数字放在第一位,然后重复取数字放在第二位,第三位.... 验证新的数列是否有序 这样做能更好的切合排序的概念
接下来上代码:
import random
def check(arr):
for i in range(1,n):
if arr[i]<=arr[i-1]:
return True
return False
if __name__=="__main__":
arr=list(map(int,input().split()))
n=len(arr)
while check(arr):
for i in range(n):
pos=random.randint(i,n-1)
t=arr[i]
arr[i]=arr[pos]
arr[pos]=t
print(arr)