Python实现排序算法

1、python实现选择算法

#选择法排序:基于选择实现
z=[29,20,35,11,18,46,67,55,44,10]
n=len(z)
print(n)
for i in range(n-1):   # n个数据排序,只需要选出n-1个最小值
    min_data=min(z[i+1:])   #从i的后一个元素开始选出最小值,并赋值给min_data
    min_index=z.index(min_data)         # min_data元素所在的下标
    if z[i]>min_data:                     # 当i值比这个最小值大时,将该最小值换到i的位置上
        z[i],z[min_index]= z[min_index],z[i]
    print(i+1,":",z)
print("-"*60)
print(z)

#该方法中特点:看似用单重循环解决问题,实际还是双重循环,因为在列表中求最大、最小值本身是需要循环实现的,只是这里用了min函数
#该方法还有一个错误:当原始序列中有重复值时,无法正确排序
#原因是min_index=z.index(min_data)找到的是第一个最小值所在处,而不是i位置之后的最小值所在处
#思考:如何纠正此错误

#上面选择排序有问题,当列表中关键字有重复时,无法排序
#因为max_index=z.index(min_data)找到的只是当前最小值的下标,但不一定在i元素之后

`#选择法排序:基于选择实现`
z=[29,35,11,20,18,46,67,55,44,10,30,20,15,20]
n=len(z)
print(z)
for i in range(n-1):
    min_data=min(z[i+1:])
    min_index=z.index(min_data,i+1)   #i+1元组开始的最小值下标,包含i+1,此处参数用i也完全可以
    print(i,":","min=",min_data,"\tindex=", min_index)
    if z[i]>min_data:
        z[i],z[min_index]= z[min_index],z[i]
    print(z)
print("-"*60)
print(z)

2、python实现冒泡算法

`#冒泡法排序:基于交换实现`
`y=[29,20,35,11,18,46,67,55,44,10]`
`n=len(y)`
`print(n)`
`for i in range(n):`
    `for j in range(n-i-1):`
        `if y[j]>y[j+1]:`
            `y[j],y[j+1]=y[j+1],y[j]`
    `print(i+1,":",y)`
`print("-"*60)`
`print(y)`
`#冒泡法排序:基于交换实现(改进:没有交换则提前结束外循环)
y=[29,20,35,11,10,18,46,67,55,44]
n=len(y)
print(n)
for i in range(n-1):
    flag=0
    for j in range(n-i-1):
        if y[j]>y[j+1]:
            y[j],y[j+1]=y[j+1],y[j]
            flag=1    #内循环中发生了交换,则需要进行下一次外循环
    print(i+1,":",y)
    if flag == 0:
        break
print("-"*60)
print(y)`

3、python实现插入排序

`#插入排序:通过选择交换实现`
`x=[29,20,35,11,18,46,67,55,44,10]`
`n=len(x)`
`for i in range(n):`
    `for j in range(i):`
        `if x[j]>x[i]:`
            `x[i],x[j]=x[j],x[i]`
    `print(i+1,":",x)`
`print("-"*60)`
`print(x)``
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浮夸半生哇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值