Python选择排序 插入排序 快速排序 归并排序

初学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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值