本文是学习算法的笔记,《数据结构与算法之美》,极客时间的课程
排序对于每个程序员来说,可能都不会陌生。平常的项目中,也经常遇到排序。按时间复杂度,分成三类,分三节来说
这里,先抛出一个问题。插入排序和冒泡排序的时间复杂度都是O(n2),可实际开发中,为什么我们更倾向于使用插入排序算法呢?
评价一个排序算法,
从效率角度说,要考虑各种时间复杂度;数据量小时,时间复复杂度的系数、常数也要考虑;元素比较和交换的次数。
从内存消耗角度说,要考虑算法的空间复杂度。空间复杂度是o(1)的排序算法,叫原地排序算法(Sorted in place)。今天说的三种算法都是原地排序算法。
从算法稳定性来说,排序算法又分为稳定性算法和非稳定性算法。稳定性,指相等元素,在排序后,原来的先后顺序不改变。
稳定性算法相对于不稳定性算法,有什么特别的用么,反正是等值,谁先谁后,不都一个样子么?实际业务中,可能会按多个属性排序。比如这么一个场景:有一批订单,按日期降序排列,如果日期一样的,按订单金额降序。
这个需要很好理解,实现起来,可能就没那么容易,按日期排好了,再把日期一样的按订单金额排一次。这个就不好实现,先把日期一样的分别取出来排下,再对应放回去,很麻烦。
有了稳定性排序算法,就很容易实现。第一步,先按订单金额降序排列,第二步,再把第一步得到的结果,按日期降序重新排列一次,就可以实现需求了。为什么自己琢磨一下吧。
接着,我们详细说下这三种排序算法,我会分别给出代码实现(java),简要说下复杂度,还有算法的评价等等。
冒泡排序算法
基本的逻辑是,取第一个元素与后一个比较,如果大于后者,就与后者互换位置,不大于,就保持位置不变。再拿第二个元素与后者比较,如果大于后者,就与后者互换位置。一轮比较之后,最大的元素就移动到末尾。相当于最大的就冒出来了。再进行第二轮