Python数据结构与算法-Day05

1.排序与搜索

排序算法的稳定性:不稳定排序算法可能会在相等的键值中改变纪录的相对次序,但是稳定排序算法从来不会如此。

如对以下元组按照第一个数字由小到大进行排序:

(4, 1)  (3, 1)  (3, 7)(5, 6)

排序结果有以下两种

(3, 1)  (3, 7)  (4, 1)  (5, 6)  (维持次序)
(3, 7)  (3, 1)  (4, 1)  (5, 6)  (次序被改变)

如果每次排序都是其中一个稳定的结果,则认为排序算法是稳定的

2.冒泡排序法

def bubble_sort(alist):
    """冒泡排序"""
    n = len(alist)
    for j in range(n-1):
        count = 0 #进行算法的优化,如果有一个循环count为0则直接排序结束
        for i in range(0, n-1-j):
            #班长从头走到尾
            if alist[i] > alist[i+1]:
                alist[i],alist[i+1] = alist[i+1],alist[i]
                count += 1
        if 0 == count:
            return
        

# i 0 ~ n-2  range(0, n-1)  j=0
# i 0 ~ n-3  range(0, n-1-1)  j=1
# i 0 ~ n-4  range(0, n-1-2)  j=2
# for j in range(len(alist)-1,0,-1):

if __name__ == "__main__":
    li = [54, 26, 93, 17, 77, 31, 44, 55, 20]
    print(li)
    bubble_sort(li)
    print(li)

最优时间复杂度O(n)

最坏时间复杂度O(n^2)

稳定性:稳定

3.选择排序法

def select_sort(alist):
    """选择排序"""
    n = len(alist)
    for j in range(n-1):  #j : 0 ~n-2
        min_index = j
        for i in range(j+1, n):
            if alist[min_index] > alist[i]:
                min_index = i
        alist[j], alist[min_index] = alist[min_index], alist[j]

if __name__ == "__main__":
    ll = [54, 226, 93, 17, 77, 31, 44, 55, 20]
    select_sort(ll)
    print(ll)

最优时间复杂度O(n^2)

最坏时间复杂度O(n^2)

稳定性:不稳定(考虑升序每次选择最大的情况)

4.插入算法

def insert_sort(alist):
    """插入排序"""
    n = len(alist)
    #从右边的无序序列中取出多少个元素执行这样的过程
    for j in range(1, n):
        # j = [1, 2, 3, ... , n-1 ]
        # i 代表内层循环的起始值
        i = j
        # 执行从右边的无序序列中取出第一个元素,即i位置的元素,然后将其插入到前面的正确位置中
        while i > 0:
            if alist[i] < alist[i-1]:
                alist[i], alist[i-1] = alist[i-1], alist[i]
                i -=1
            else:
                break

if __name__ == "__main__":
    ll = [93, 54, 77, 31, 44, 55, 226]
    print(ll)
    insert_sort(ll)
    print(ll)

最优时间复杂度O(n)

最坏时间复杂度O(n^2)

稳定性:稳定

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值