判断大小简单算法_十大排序算法(一)冒泡排序

257d6a65095e354c7c520250bc38dbcc.png

大家好,我是你们的才辰。

e07dd62425a92f69c647acbee6eb180e.png

众所周知,十大排序算法是我们必须掌握的算法。这里我先把十个算法的名称列一下:

  • 冒泡排序
  • 选择排序
  • 插入排序
  • 希尔排序
  • 归并排序
  • 快速排序
  • 基数排序
  • 堆排序
  • 桶排序
  • 计数排序

因为我想建立一个比较完整的知识体系,所以对于比较简单基础的知识我也会写。对于已经学会的小伙伴就当做回顾一下吧。

话不多说,直接开始。今天整理了一下比较简单的冒泡排序。


准备

在介绍算法之前,先简单解释几个概念:

  • 时间复杂度:一个算法执行所消耗的时间
  • 空间复杂度:运行一个算法所消耗的内存大小
  • 是否是稳定排序:如果在排序前a=b,a在b前面,排序后a仍在b前面,则为稳定排序;如果在排序前a=b,a在b前面,排序后a有可能在b后面,则为非稳定排序。

算法解释

冒泡排序是一个比较经典的排序算法。我先用文字解释一下算法的过程,然后结合一个具体的实例来加深理解,最后给出了算法代码。

对于一组包含n个数据的数组,冒泡排序在最坏情况下要进行n趟排序(也可以说是n-1趟,因为最后一次遍历可以省略):

第一趟:依次比较下标为0和1、1和2、2和3,n-2和n-1的元素,如果第一个元素大于第二个元素,则交换它们,否则不交换。经过一次遍历后,最大的元素排到了最后;

第二趟:依次比较下标为0和1、1和2、2和3,n-3和n-2的元素,如果第一个元素大于第二个元素,则交换它们,否则不交换。经过第二次遍历后,第二大的元素排到了倒数第二个位置;

.......

第n-1趟:比较下标为0和1的元素,如果第一个元素大于第二个元素,则交换它们,否则不交换。经过第n-1次遍历后,第二小的元素排到了第二个位置;

第n趟:此时下标为0的元素就是最小元素,排序结束。

实例

直接讲解算法的过程比较抽象,我打算结合一个具体的实例来讲解。

假设有一个数组arr={6,2,4,8,3}

48e4433b9e658fa25c1ca8caf276e5bd.png

第一步:首先把第一个元素和第二个元素比较,如果第一个比第二个大,就交换两个数的位置。arr[0]=6,arr[1]=2,6>2,故交换两个数的位置;

02089797109211f811f70d462edc048f.png

接着将第二个数和第三个数比较,如果第二个数大于第三个,则交换它们的位置;6>4,交换位置;

424008b45fbd516a72bb23f69b21fddf.png

接着比较6和8,6<8,不用交换位置,接下来比较8和3,8>3,交换位置。这样,就完成了一次遍历;

fa8f563f972f933d8309bc7f2315adef.png

接下来开始第二次遍历,过程和第一次相同,唯一区别就是最后一个元素8不再参与比较。2<4,4<6,不用交换位置,接着6>3,交换位置,第二次遍历结束。结果如下:

1ca3a03295ab1989970a01884c26c74b.png

这样,元素6就放在了正确位置。

接下来遍历2-4-3,将元素4放在了正确位置;

接下来遍历2-3,将元素3放在了正确位置;

接下来只剩下1个元素2,自然就是有序的。

358d5959cc73bb2591d7eaae4ea0516b.png

代码实现

1c5744d524287b85f31f399ec2d5131f.png

时间复杂度:O(n*n)

空间复杂度:O(1)

是否是稳定排序:是

优化

在遍历过程中,如果数组已经是有序的,则剩下的遍历过程可以省略,这样可以节省时间。

例如在上面的例子中,第3次遍历之后,数组已经是有序的,则可以省略后两次的遍历。

优化方法就是判断在某一次遍历中是否有数据进行交换,若没有则表明排序已经完成。为此,可以定义一个标志变量,用来判断一次遍历过程是否有数据交换。

13574be8b43fab2b5d34733d41c9578c.png

最后,学习更多算法+计算机基础知识,欢迎来公众号【编程365】找我哦。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值