猴子排序(优化版)

猴子排序效果低劣,原代码不是很繁琐:

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))。

  • 10
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值