几种简单排序算法(冒泡,插入排序)的python实现

一,冒泡排序:
1,平均时间复杂度:O(n^2) 属于稳定算法
2,算法过程:重复地走访过要排序的元素,一次比较相邻两个元素,如果他们的顺序错误就把他们调换过来,直到没有元素再需要交换,排序完成。

a = [1,2,6,4,1,2,3,49,7]
for i in range(len(a)-1,0,-1): #8-0
    for j in range(i):  #7-0
        if a[j] > a[j + 1]:
            a[j],a[j + 1] = a[j + 1],a[j]
print(a)

结果:[1, 1, 2, 2, 3, 4, 6, 7, 49]

二,冒泡排序变换—鸡尾酒排序/定向冒泡排序
1,属于稳定算法, 一般情况与冒泡相同,特殊情况可以很优秀,以序列(2,3,4,5,1)为例,鸡尾酒排序只需要访问一次序列就可以完成排序,但如果使用冒泡排序则需要四次。但是在乱数序列的状态下,鸡尾酒排序与冒泡排序的效率都很差劲。
2,此算法与冒泡排序的不同处在于从低到高然后从高到低,而冒泡排序则仅从低到高去比较序列里的每个元素。他可以得到比冒泡排序稍微好一点的效能

a = [1,2,6,4,1,2,3,49,7]#0-8
for i in range(len(a)-1,0,-2):#8,6,4,2
    for j in range((8-i)//2,(8+i)//2):#0-8,1-7,2-6,3-5
        if a[j] > a[j + 1]:
            a[j],a[j + 1] = a[j + 1],a[j]
    for k in range((8+i)//2-1,(8-i)//2,-1):
        if a[k] < a[k - 1]:
            a[k],a[k - 1] = a[k - 1],a[k]
print(a)

结果:[1, 1, 2, 2, 3, 4, 6, 7, 49]

三,插入排序 (稳定算法O(n^2))
具体算法描述如下:
1.从第一个元素开始,该元素可以认为已经被排序
2.取出下一个元素,在已经排序的元素序列中从后向前扫描
3.如果该元素(已排序)大于新元素,将该元素移到下一位置
4.重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
5.将新元素插入到该位置后
6.重复步骤2~5

a = [1,2,6,4,1,2,3,49,7]
for i in range(1,len(a)):
    for j in range(len(a[:i]),0,-1):
        if a[i] >= a[j-1]:
            a.insert(j,a[i])
            del(a[i+1])
            break
print(a)

结果:[1, 1, 2, 2, 3, 4, 6, 7, 49]

四,二分插入排序
对于插入排序,如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的数目

a = [1,2,6,4,1,2,3,49,7]
for i in range(1,len(a)):
    for j in range(1,len(a[:i])+1):
        if a[i] >= a[1-(j-1)//(2*j)]:
            if a[i] <= a[1-(j-1)//(2*j)+1]:
                a.insert (1-(j-1)//(2*j)+1, a[i])
                del (a[i + 1])
                break
        elif a[i] <= a[1-(j-1)//(2*j)]:
            if a[i] >= a[1-(j-1)//(2*j)+1]:
                a.insert (1-(j-1)//(2*j)+1, a[i])
                del (a[i + 1])
                break
        elif a[i] <= a[(j - 1) // (2 * j)]:
            if a[i] >= a[(j-1)//(2*j)-1]:
                a.insert ((j-1)//(2*j), a[i])
                del (a[i + 1])
                break
        elif a[i] <= a[(j - 1) // (2 * j)]:
            if a[i] >= a[(j-1)//(2*j)-1]:
                a.insert ((j-1)//(2*j), a[i])
                del (a[i + 1])
                break
print(a)

结果:[1, 2, 2, 4, 6, 1, 3, 49, 7]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值