Python的排序算法入门,快来了解一哈

目录

一、插入排序

1.插入排序概念

 2.代码实现

3.时间复杂度

二、归并排序

1.归并排序概念

2.代码实现

3.时间复杂度


一、插入排序

1.插入排序概念

注意:对于少量元素的排序,它是一个有效的算法

插入排序简单来说就像许多人排序一手扑克牌。开始时,我们的左手为空并且桌子上的牌面朝下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与已在手中的牌进行比较。

 2.代码实现

思路:

  • 第一步:遍历列表
  • 第二步:从列表的第一个元素开始,每一次循环都从右向左依次比较大小,并且交换
def insertSort(number):
    for num in range(len(number)):
        i = num
        while number[i-1] >= number[i] and i-1 >= 0:
            number[i-1], number[i] = number[i], number[i-1]
            i -= 1
    return number


if __name__ == '__main__':
    list1 = [32, 19, 77, 8, 3, 9, 20, 31, -7, -22, 60]
    print(insertSort(list1))

3.时间复杂度

  • 最好的情况下(也就是完全有序的情况),插入排序次只需要比较一次,时间复杂度为O(n)。
  • 最坏的情况下(也就是完全逆序的情况),每一次循环都需要把未排序的元素插入到已排序的序列第一位,时间复杂度为O(n^2)

二、归并排序

1.归并排序概念

归并排序算法完全遵循分治模式,在每层递归时都有三个步骤:

  • 分解:分解待排序的n个元素的序列成各具n/2个元素的两个子序列
  • 解决:使用归并排序递归的排序两个子序列
  • 合并:合并两个已排序的子序列,以产生最后的排序结果

2.代码实现

def merge(left, right):  # 步骤二:进行排序
    result = []
    l = r = 0  # l为left列表的下标,r为right列表的下标,
    while l < len(left) and r < len(right):
        if left[l] <= right[r]:
            result.append(left[l])
            l += 1
        else:
            result.append(right[r])
            r += 1
    if l == len(left):
        for i in right[r:]:
            result.append(i)
    else:
        for i in left[l:]:
            result.append(i)
    return result


def merge_sort(number):  # 步骤一:将整个序列一分为二
    if len(number) <= 1:
        return number
    else:
        middle = len(number) // 2
        left_index = merge_sort(number[0:middle])
        right_index = merge_sort(number[middle:])
        return merge(left_index, right_index)


if __name__ == '__main__':
    list1 = [10, 3, 28, -5, -6, 11, 50, 77, 35]
    print(merge_sort(list1))

3.时间复杂度

虽然待排序的元素数量不是偶数时也能正确的工作,但是假定原问题规模是2的幂,那么基于递归式的分析将被简化。这时每个分解步骤将产生规模刚好为n/2的两个子序列,直到子序列中只有一个元素的时候,停止分解。

所以时间复杂度为:

  • 若n(原问题规模)=1,T(n)=c
  • 若n>1,T(n) = 2T(n/2) + cn
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

勇敢小牛

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

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

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

打赏作者

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

抵扣说明:

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

余额充值