【一起来刷题】基础排序问题之选择排序、冒泡排序、插入排序

最近准备新开一个有关数据结构算法的专栏。讲一讲LeetCode中常见题型的解题方法。对于刷题这种事,我想说,真的百说不如一练,所以原理上大家一遍两遍没弄懂没关系,真的需要多刷题才能其义自见。而且很多时候,解题思路如果被你深刻体会到了之后,往往难以用语言进行二次转述,就是那种贱贱的感觉,反正挺玄学的。

就我过来经验,除非一些非常简单的题,稍微难一点的题,对于初次刷题的小伙伴来说,一道题耗费3天都不为过,当然我说的是正常作息条件下。一道题做了四五遍,基本上才能够心领神会,不会很快忘记。

开设这一专栏,一方面为了自己刷题记录,另一方面也想和大家一起交流学习~保持代码手感

目录

一、选择排序

二、冒泡排序

 三、插入排序


我们先从最基本的排序算法开始吧,这一专栏,我的风格是原理不会讲的太繁杂,最多的是提供代码和注释,我觉得看代码比啥都强。本文先介绍几个简单的排序算法:选择、插入、冒泡。它们的时间复杂度都是gif.latex?O%28N%5E2%29,空间复杂度为gif.latex?O%281%29

一、选择排序

我们给定一个数组,用选择排序法将其升序排序。实现上,主要思路:

(1)第一层循环:从第i个数开始,记录第i个数的值;,

(2)第二层循环:从i+1开始,寻找包括第i个数在内的最小值,并交换该值和第i个数的值;

(3)继续(1)的循环。

感官上,其实就是从一堆无序数中找到最小值,放在第一个位置,再从剩下的数中找到最小值,放在第二个数,再从剩下的……

如下动图所示:

20210509190545640.gif#pic_center

 

def choiceSort(self, nums):
    if len(nums) == 1:
        return nums
    right = len(nums) - 1
    for i in range(right):
        # 记录第i个数的值和索引
        minum = nums[i]
        minid = i
        # 寻找包括第i个数在内的剩余数中的最小值
        for j in range(i + 1, right + 1):
            if nums[j] < minum:
                minum = nums[j]
                minid = j
        # 将第i个数与找到的最小值互换位置,当然,最小值也可能还是第i个数本身
        nums[i], nums[minid] = nums[minid], nums[i]
    return nums

二、冒泡排序

冒泡排序非常经典了,面试有时候甚至还能见到,实现上,主要思路如下:

(1)从第i个数开始遍历,如果第i个数大于第i+1个数,那么这俩数互换位置,直到遍历完成,此时第N-i个数是最大值哦

(2)i=i+1,继续(1);

如下动图所示:

20210509190446264.gif#pic_center 

def bubbleSort(self, nums):
    if len(nums) == 1:
        return nums
    left, right = 0, len(nums) - 1
    while right >= 0:
        # 从第i个数开始判断,如果第i个数大于第i+1个数,那么这俩数交换位置
        for i in range(right):
            if nums[i] > nums[i + 1]:
                nums[i], nums[i + 1] = nums[i + 1], nums[i]
        # 每次经过一轮内层循环后,循环停止的位置的值就是该值所在位置之前数中的最小值,因此不再参与循环
        right -= 1
    return nums

 三、插入排序

插入排序其实用的还是蛮多的,甚至一些编程语言的内置排序算法都有用到插排,插入排序是往前插的,具体思路是:

(1)外层循环:从第2个位置开始遍历;

(2)内层循环:从外层循环当前所在位置开始往前遍历,判断当前数是否小于前一个数,如果小,互换位置,直到循环到第一个位置为止,因为第一个位置前面没数了

(3)继续(1)和(2)步,直到外层循环至最后一个位置;

感官上,其实就是从后面的数中选一个当前最小的数往前插。如下动图所示:

20210223174254141.gif#pic_center

def insertSort(self, nums):
    if len(nums) == 1:
        return nums
    right = len(nums)
    # 从第二个数开始遍历
    for i in range(1, right):
        # 从i位置开始往前遍历,每到达一个位置,判断当前位置的数是否小于前一个位置的数,如果是,则互换数值
        while i > 0:
            if nums[i] < nums[i - 1]:
                nums[i], nums[i - 1] = nums[i - 1], nums[i]
            i -= 1
    return nums

下篇讲解基础排序算法中时间复杂度为O(NlogN) 的非常重要的快速排序算法,关注我,持续更新哦!

❤️各位小伙伴们关注我的大道至简之机器学习系列专栏,一起学习各大机器学习算法

❤️还有更多精彩文章(NLP、热词挖掘、经验分享、技术实战等),持续更新中……欢迎关注我,主页:尚拙谨言的博客_CSDN博客-大道至简系列,机器学习算法系列,学习经验分享领域博主,记得点赞+收藏哦!

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

五点钟科技

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

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

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

打赏作者

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

抵扣说明:

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

余额充值