排序算法的python实现与算法分析——冒泡排序(Bubble Sort)与选择排序(Selection Sort)

1 冒泡排序:

对无序表进行多次比较排序,分别比较两两相邻的数据并互换逆序数据项,第一趟实现最大项就位,第二趟实现次大项就位,经过n-1次实现整表排序。
第一趟排序过程:
在这里插入图片描述
python实现源码:

##冒泡排序  普通版
def bubblesort(alist):
    for passnum in range(len(alist)-1,0,-1):
        for i in range(passnum):
            if alist[i] > alist[i+1]:
                temp = alist[i]
                alist[i] =alist[i+1]
                alist[i+1]=temp
alist=[54,28,93,17,31,44,20]
bubblesort(alist)
print(alist)
##[17, 20, 28, 31, 44, 54, 93]

算法分析:无序表初始数据的排列状况对其没有影响
算法需要比对n-1趟,每次比对次数逐步从n-1减少到1,因此比对次数为n-1的累加,即:0.5n^2-0.5。因此,时间复杂度为O(n ^2)
注:冒泡排序通常作为时间效率最差的排序算法,作为其他排序算法的对比基准。但其具有无需任何额外的存储空间开销。

冒泡算法改进:

通过检测每趟对比是否发生过交换,可以提前确定排序是否完成。若某趟对比没发生任何交换,则说明已经排好序,可以提前结束。
该算法python实现:

##冒泡排序  改进版
def shortbubblesort(alist):
    exchanges=True
    passnum=len(alist)-1
    while passnum >0 and exchanges:
        exchanges = False
        for i in range(passnum):
            if alist[i]>alist[i+1]:
                exchanges =True
                alist[i],alist[i+1]=alist[i+1],alist[i]
        passnum =passnum-1

alist1=[20,30,90,50,40,60,70,80,100,110]
shortbubblesort(alist1)
print(alist1)
###  [20, 30, 40, 50, 60, 70, 80, 90, 100, 110]

2 选择排序

选择排序是在冒泡的基础上进行改进,保留了多趟对比,但是每趟都使其当前最大项就位。
特点:其对交换进行了削减,其通过记录最大项的位置,然后再与本趟最后一项进行交换,
排序实现过程:
在这里插入图片描述
python实现源码:

###选择排序  
def selectionsort(alist):
    for fillslot in range(len(alist)-1,0,-1):
        positionofmax=0
        
        for location in range(1,fillslot+1):
            if alist[location] > alist[positionofmax]:
                positionofmax =location
        temp =alist[fillslot]
        alist[fillslot]=alist[positionofmax]
        alist[positionofmax]=temp

alist2=[0,1,6,7,9,3,12,16,8]
selectionsort(alist2)
print(alist2)
### [0, 1, 3, 6, 7, 8, 9, 12, 16]

算法分析:还是经过了n-1趟,每趟对比次数从n-1逐渐减少到1,因此时间复杂度仍然为O(n^2)。但是交换次数减少到O(n)次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

笨猪起飞

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

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

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

打赏作者

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

抵扣说明:

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

余额充值