常见排序算法

用python实现常见排序算法

排序列表:a=[1, 11, 17, 15, 14, 18, 19, 5, 6, 18]

冒泡排序法

原理:依次比较相邻元素的大小,并将大的元素后移,那么经过第一轮的排序后,最大值已经排到最后一位了;第二轮排序时,只需要将前len(a)-1个元素排序即可;依次重复len(a)-1轮即可完成排序

实现代码

#冒泡排序
for i in range(len(a)-1):
    for j in range(len(a)-i-1):
        if a[j]>a[j+1]:
            a[j],a[j+1]=a[j+1],a[j]
print(a)

优化思路:如果某一轮两两比较中没有任何元素交换,这说明已经都排好序了,算法结束,可以使用一个Flag做标记,默认为false,如果发生交互则置为true,每轮结束时检测Flag,如果为true则继续,如果为false则返回。

#冒泡排序算法优化
for i in range(len(a)-1):
    flag=False
    for j in range(len(a)-i-1):
        if a[j]>a[j+1]:
            a[j],a[j+1]=a[j+1],a[j]
            flag=True
    print("第{}轮排序,结果为:{}".format(i,a))
    if not flag:
        break

插入排序法

算法思想:遍历数组,遍历到 i 时,a0,a1…ai-1是已经排好序的,取出ai,从ai开始向前相邻两个比较大小,如果后面元素小于前面,则互换位置,如果不小于,则直接跳出该轮的循环。当待排序的数据基本有序时,插入排序的效率比较高,只需要进行很少的数据移动。

#插入排序法
for i in range(1,len(a)):
    for j in range(i,0,-1):
        print("i:{},j:{},a[{}]={},a[{}]={}".format(i,j,j,a[j],j-1,a[j-1]))
        if a[j]<a[j-1]:
            a[j],a[j-1]=a[j-1],a[j]
            print("第{}-{}轮排序结果为:{}".format(i,j,a))
        else:
            break  #由于前j-1个元素已经按照从小到大的顺序排列好了,如果发现第j个大于第j-1个元素,则可以不用进行该轮的两两比较了

快速排序法

算法思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

#快速排序法

def quick_sort(data):
    if len(data)>=2:
        mid=data[len(data)//2]#选取一个基准值,可以是第一个也可以是最后一个,随机选
        left,right=[],[]
        data.remove(mid) #删除基准值,那基准值和剩下的元素一一比较,并分别将大于和小于等于基准值的元素分别放在右列表和左列表中
        for num in data:
            if num>mid:
                right.append(num)
            else:
                left.append(num)
        return quick_sort(left)+[mid]+quick_sort(right)
    else:
        return data
    
选择排序法

算法思想:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。

#选择排序法
for i in range(len(a)-1):
    min_index=i
    for j in range(i+1,len(a)):
        if a[j]<a[min_index]:
            min_index=j
    a[i],a[min_index]=a[min_index],a[i]
print(a)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Jepson2017

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

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

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

打赏作者

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

抵扣说明:

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

余额充值