排序算法之冒泡排序&插入排序

  • 排序概述

  排序在计算机程序设计中是一种非常重要的操作,它的功能是将一个数据元素的任意序列,重新排列成一个按照关键字有序的序列。排序算法有非常多,各种各样的排序,你很难去说哪一个最好哪一个更好,只能说 ”存在即合理“ ,每一种排序算法都有自己的特点和优势之处,因此在什么样的场景下选用什么样的排序算法就显得很重要了,这就需要我们能够较为全面地去分析一个排序算法,那么我们一般可以从这几个方面来分析一个排序算法:
1、时间开销: 这个不用多说,是我们必须要关注的一个点,而且我们需要关注最坏情况的时间复杂度、最好情况下时间复杂度、平均情况的时间复杂度。为什么需要区分这三种呢?因为对于我们待排序的序列,有的序列可能有序程度比较高,而有的序列可能有序程度比较低,对于这两种情况显然表现是不一样的。我们需要知道不同的排序算法在不同的数据下的表现性能。
  此外,我们知道在分析时间复杂度的时候,我们往往会忽略掉常数项还有低阶项,系数项。不过在我们的实际开发中,排序的数据规模可能会比较小,这个时候系数,低阶项可能就会对结果有比较大的影响了,因此就不能忽略掉。
  我们的排序算法中,有很多是基于比较的一种策略,那么这个时候我们就需要考虑比较的次数会不会对算法的性能产生影响。
2、空间开销 排序算法的空间开销我们可以通过空间复杂度来衡量,在这里由一个概念叫做 ”原地排序(sorted in place)",原地排序就是指空间复杂度在O(1)的算法。
3、稳定性 我们在排序的分类中讲解。

  • 排序的分类

  我们之前看到了关于衡量一个排序算法的标准,其中有一项叫做稳定性,那什么是排序的稳定性呢?我们来看看定义:假如现在有一个序列Ri(i=1,2,…,n),现在我们假设序列中有两个数据元素的Ki = Kj ( i != j ),并且在序列中Ki 领先于Kj,在经过排序算法后,Ki仍然领先于Kj,那么我们就说这个排序算法是稳定的,反之则排序算法是不稳定的。其实我们为什么要关注这个算法是否稳定呢?因为在实际中我们可能是对一些对象按照关键字Key来进行排序,这个时候我们可能会希望某一个对象在key相同的情况下保持原来的顺序。
  上面我们通过排序算法是否稳定来对排序算法进行分类,还有一种分类是根据排序过程中涉及到的存储器来分类。其一是内部排序: 指待排序的数据元素存放在计算机的随机存储器中进行排序的过程;其二是外部排序: 指待排序的数据量很大,以至于内存依次无法容纳全部记录,在排序过程中需要对外部存储器访问的排序过程。我们之后说得排序都是属于内部排序。

  • 冒泡排序(Bubble Sorting)

  冒泡排序可能是我们学习的第一个排序算法了,它的原理非常简单,就是让相邻的两个元素去比较,看看是否满足大小关系的要求,如果满足则保持原来的位置,如果不满足则互换两个元素的位置,然后接着与后面的元素比较,直到遍历完这个序列,这个过程叫做 bubble up,就像冒泡一样,一趟bubble up至少能够让一个元素找到正确的位置。我们举个例子,假如有个数组arry[5] = {3, 5, 1, 4, 6, 2},现在按照升序排序,看看它的过程:
在这里插入图片描述
可以看到经过第一趟bubble up最大的数字已经找到了应该在的位置,因此对于一趟bubble up 可以排好一个数,那么如果需要将6个数组全部排好位序只需要进行6次bubble up即可。
在这里插入图片描述
我们看到实际上,在进行完第四次bubble up的时候这个序列已经有序了,我们就不需要再进行冒泡了,因此整个冒泡可以进行一定的优化,减少无效的操作来提高算法执行的效率。例如我们每次bubble up完的时候设置一个flag用以记录是否进行了交换操作,如果有则继续进行,没有则说明整个序列已经有序则直接停止进行。
  现在我们按照之前给出的几个维度来分析这个算法。首先冒泡排序算法整个空间复杂度为O(1),因为它仅仅需要一个中间变量进行交换即可,因此冒泡排序是原地排序。 在元素进行比较的过程中,如果发现元素满足条件我们的做法是不交换元素,因此在整个过程中,如果有相同元素它们的相对位置是不会改变的,因此<

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值