初学python,对几个排序稍做整理,如有错误还请指出。
选择排序
法一:在一组数中选择最小的放在第一个
#Seletion sort 在一组数中选择最小的放在第一个
def Seletion sort1(L):
for i in range(len(L)-1):
min_=i
for j in range(i+1,len(L)): #选择最小的数
if L[j]<L[min_]:min_=j #遍历之后找到最小的
L[min_],L[i]=L[i],L[min_] #把最小的交换到前面
return L
L=[3,2,6,5]
Seletion sort1(L)
法二:运用嵌套函数
#Seletion sort2 运用嵌套函数
def Seletion sort2(L):
def find_min(L):
min_=0
for i in range(len(L)):
if L[i]<L[min_]:min_=i
return min_
for i in range(len(L)-1):
min_=find_min(L[i:]) #这个min-对应的索引是列表切片后的
#新列表中的索引,所以需要返回原列表中的索引需要加i
L[min_+i],L[i]=L[i],L[min_+i] #min_+i返回原来列表中的索引
return L
L=[1,5,7,9,3,2,4]
Seletion sort2(L)
法三:运用递归
# 递归实现选择排序
def Seletion sort3(L):
L=L[:] #虽然后面是切片操作会产生新列表不会影响到原列表,但
#是在第一次比较时会改变原来列表的值,所以需要先复制
if len(L)<=1:return L
min_=0
for i in range(1,len(L)): #把第一个数和后面n-1个数比较,找到最小的放到第一个位子上
if L[i]<L[min_]:min_=i
L[min_],L[0]=L[0],L[min_]
return [L[0]]+ss3(L[1:])
L=[3,4,2,5,3,6,2]
Seletion sort3(L)
插入排序
法一:
#插入排序 将一个待排序的数插入到前面已经排好序的列表当中 保证插入元素后的列表还是有序的
def insertion(L,a):
for i in range(len(L)):
if L[i]>a:
return L[0:i]+[a]+L[i:len(L)]
return L+[a]
def insertion_sort(L):
L0=[]
for i in L:
L0=insertion(L0,i)
return L0
L=[3,4,1,6,2,3]
insertion_sort(L)
法二:不用切片用索引
#法一优化
def insertion(L,i):
a=L[i+1]
for index in range(i+1):
if L[index]>a:break
else:index=i+1
for k in range(i+1,index,-1):
L[k]=L[k-1]
L[index]=a
return L
def insertion_sort(L):
for i in range(len(L)-1):
L=insertion(L,i)
return L
L=[3,2,4,1,5,4]
insertion_sort(L)
法三:运用递归
#运用递归
def insertsort(L):
def r_insertsort(R,L):
if len(L)==0:return R
for i in range(len(R)):
if L[0]<=R[i]:
return r_insertsort(R[0:i]+[L[0]]+R[i:],L[1:])
return r_insertsort(R+[L[0]],L[1:])
return r_insertsort([],L)
L=[5,6,4,3,2,1]
insertsort(L)
快速排序
from random import randint
def quicksort(L):
if len(L)<=1:return L
L1=[];L2=[]
r=randint(0,len(L)-1)
for i in range(0,r):
if L[i]<=L[r]:L1.append(L[i])
else:L2.append(L[i])
for i in range(r+1,len(L)):
if L[i]<=L[r]:L1.append(L[i])
else:L2.append(L[i])
return quicksort(L1)+[L[r]]+quicksort(L2)
L=[2,6,5,3,1,0,3]
quicksort(L)
归并排序
#归并排序
def merge(A,B):
if len(A)==0:return B
elif len(B)==0:return A
if A[0]>B[0]:return [B[0]]+merge(A,B[1:])
else:return [A[0]]+merge(A[1:],B)
def mergesort(L):
if len(L)<=1:return L;
L1=mergesort(L[0:len(L)//2])
L2=mergesort(L[len(L)//2:])
return merge(L1,L2)
L=[5,2,3,6,91]
mergesort(L)