【数据结构】python的一些排序方法


一、直接插入排序

代码如下(示例):

#直接插入排序
def insertsort(a):
    for i in range(len(a)-1):
        if a[i+1]<a[i]:
            #print(a)
            index=i #要点:在j变化时,i也要跟着变(因为涉及元素交换),因此不能直接用i进行循环
            for j in range(index,-1,-1): #在已排好序的序列中找寻它应该在的位置
                if a[i+1]<a[j]:
                    a[i+1],a[j]=a[j],a[i+1]
                    i=i-1 #同上
                    print(a,'\n')
    return a
a=[43,15,36,85,24,45,67,90]
insertsort(a)

二、冒泡排序

代码如下(示例):

#冒泡排序
def bubblesort(a):
    for i in range(len(a)): #可以理解为排好序的子序列长度
        for j in range(len(a)-1,i,-1): #从最后遍历
            if a[j]<a[j-1]:
                a[j],a[j-1]=a[j-1],a[j]
    return a
a=[43,15,36,85,24,45,67,90]
bubblesort(a)

三、简单选择排序

代码如下(示例):

#简单选择排序
def selectsort(a):
    for i in range(len(a)):
        amin=i
        #print(i,a)
        for j in range(i,len(a)):
            if a[j]<a[amin]:
                amin=j #选出最小值,注意需要记录的是索引,不是直接记录最小值,不然交换会没有意义
        a[i],a[amin]=a[amin],a[i]
    return a
a=[43,15,36,85,24,45,67,90]
selectsort(a)

四、快速排序

代码如下(示例):

#快速排序
def findpivot(a,i,j):#i,j表示子序列最左和最右的下标,三值选中法
    #print(a)
    m=int((i+j)/2)
    if a[i]>a[j]:
        a[i],a[j]=a[j],a[i]
    if a[j]<a[m]:
        a[j],a[m]=a[m],a[j]
    if a[m]<a[i]:
        a[i],a[m]=a[m],a[i]
    print(a[m])
    return m #返回索引值
def partition(a,i,j,pivotindex): #对选出轴值的序列进行两边分配,从两边向中间遍历
    print(a)
    i=i+1
    j=j-1
    while i<j:
        while(a[i]<a[pivotindex]):
            i=i+1
        while(a[j]>a[pivotindex]):
            j=j-1
        if i<j:
            a[i],a[j]=a[j],a[i]
    return i  #现在i,j交错,i是右边序列的第一个索引
def quicksort(a,i,j):
    if j<=i: #无记录或仅有一个元素
        return a
    pivotindex = findpivot(a,i,j)
    #将轴值放在最后
    a[j],a[pivotindex]=a[pivotindex],a[j]
    k = partition(a,i-1,j,j) #分两段
    #把轴值放回中间
    a[k],a[j]=a[j],a[k]
    print(a)
    if(k-i>1):
        quicksort(a,i,k-1)
    if(j-k>1):
        quicksort(a,k+1,j)
    return a
a=[43,15,36,85,24,45,67,90]
quicksort(a,0,len(a)-1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值