算法入门——插入排序、快速排序

目录

插入排序

快速排序


上篇文章学习了算法入门——冒泡排序、选择排序,这篇文章我们学习算法入门——插入排序、快速排序。

插入排序

插入排序是在一组列表中,假设列表只有该列表的第一个元素,再与该列表的第二个元素作对比,当第二个元素比第一个元素小时,则第二个元素插入到第一个元素前面,再与该列表的第三个元素作对比,当第三个元素比第二个元素小,但比第一个元素大时,则第三个元素放在第一个元素后面,第二个元素移动到第三个元素的位置。

插入排序类似我们的打扑克牌,其基本原理如下:

插入排序的代码关键是如何实现插入位置后面的元素进行后移。

示例代码如下:

li = [4, 2, 5, 3, 1]
def insert_sort(li):
    for i in range(1, len(li)):
        tmp = li[i]             # 列表第i个元素
        j = i - 1               # 列表第i-1个元素
        while 0 <= j and tmp < li[j]:  # 当前面的元素大于后面的元素时
            li[j + 1] = li[j]   # 将比tmp大的元素后移一位
            j -= 1              # 对更前面的元素作对比
        li[j + 1] = tmp         # 将tmp元素插入到小的后面
        print(li)
insert_sort(li)

运行结果如下:

插入排序的时间复杂度为:O(n²)

快速排序

快速排序是取某个元素(通常是第一个元素)出来后,先从右边开始比较,比该元素小就放在空位上,再从左边开始比较,比该元素大就放在空位上,直到把取出来的元素放在空位上,这时就把取出来的值作为界限分为左右两侧,再把左右两侧按照刚才的操作执行。

示例代码如下:

def partition(li, left, right):
    tmp = li[left]  # 取第一个元素
    while left < right:
        while left<right and li[right] >= tmp:  # 从右侧的元素大于等于tmp元素
            right -= 1  # 对比右侧前一个元素
        li[left] = li[right]            # 将右边的值写到左边空位上
        print(li)
        while left<right and li[left] <= tmp:  # 从左侧的元素小于等于tmp元素
            left += 1   # 对比左侧后一个元素
        li[right] = li[left]            # 将左边的值写到右边空位上
        print(li)
    li[left] = tmp                  # 将取出来的元素放在空位上
    return left
li=[5,7,3,6,2,4,8]
partition(li,0,len(li)-1)
print(li)

运行结果如下所示:

可以看到来列表以5为界限分了左右侧,接下来左右侧执行刚才的操作即可完成排序,示例代码如下:

def quick_sort(li,left,right):
    if left<right:
        mid=partition(li,left,right)        # 获取取出来的元素后的存放位置
        quick_sort(li,left,mid-1)           # 左侧
        quick_sort(li,mid+1,right)          # 右侧
li=[5,7,3,6,2,4,8]
quick_sort(li,0,len(li)-1)
print(li)

运行结果如下:

快速排序的时间复杂度为:O(nlogn)

好了,算法入门——插入排序、快速排序就学到这里了,下篇文章学习算法入门——堆排序

公众号:白巧克力LIN

该公众号发布Python、数据库、Linux、Flask、自动化测试、Git、算法等相关文章!

- END -

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

白巧克力LIN

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

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

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

打赏作者

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

抵扣说明:

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

余额充值