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