python 冒泡排序/选择排序/约瑟夫环----源代码

def maopao():#冒泡排序
    a=[1,4,5,2,3]
    for j in range(0,len(a)-1):
        for i in range(0,len(a)-1):
            if(a[i]>a[i+1]):
                b=a[i]
                a[i]=a[i+1]
                a[i+1]=b
    print(a)


def xuanzhe():#选择排序
    a=[1,4,5,2,3]
    c=[]
    for j in range(0,len(a)):
        b=a[0]
        for i in range(0,len(a)):
            if b<a[i]:
                b=a[i]
        c.append(b)
        a.remove(b)
    print(sorted(c))

def yuese(a,m):#约瑟夫环
    if len(a)>0:
        b=[]
        for i in range(1,len(a)+1):#遍历初始列表找出整除m的位置
            if i%m==0:
                b.append(a[i-1])#将整除m的位置存起来
        if len(a)>=m:#在递归的末尾会出现m>len(a)的情况
            c=len(a)%m#由于是要围成一个圈依次报数,将其后c(此次删除后剩余的几位作为下一次删除前列表开始的几位)位,移到列表前端
            for j in b:
                a.remove(j)#删除
                print('del---'+str(j))
                print("after del:")
                print(a)#输出
            if c!=0:#不整除创建新的a,也就是前面说的,将后c位前移
                for k in range(c):
                    a.insert(k,a[k-c])
                    del a[k-c]
            yuese(a,m)#递归
        '''
        elif len(a)<m:#另外的一种情况
            c=m%len(a)#换一种思维,用m来除以a的长度(这是规律,自己可以试)
            if c==1:#分三种情况
                u=a[c-1]
                del a[c-1]
                print('del---'+str(u))
                print("after del:")
                print(a)
                yuese(a,m)#递归
            elif c==0:
                u=a[-1]
                del a[-1]
                print('del---'+str(u))
                print("after del:")
                print(a)
                yuese(a,m)#递归
            elif c>1:
                p=a[c:]
                q=a[:c-1]
                a=p+q
                print(a)
                yuese(a,m)#递归
       '''

a=[]
for j in range(40):
    a.append(j+1)
print("start:")
print(a)
yuese(a,3)
print("finish!!")


运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值