HTML5学堂-码匠:本期继续走入算法 —— 冒泡排序法。冒泡排序算法相对简单,容易上手,稳定性也比较高,
算是一种较好理解的算法,也是面试官高频提问的算法之一。面试
Tips:关于“算法”及“排序”的基础知识,在此前“选择排序法”中已详细讲解,可点击文后的相关文章连接查看,在此再也不赘述。算法
从序列头部开始遍历,两两比较,若是前者比后者大,则交换位置,直到最后将最大的数(本次排序最大的数)交换到无序序列的尾部,从而成为有序序列的一部分;
下次遍历时,此前每次遍历后的最大数再也不参与排序;
屡次重复此操做,直到序列排序完成。
因为在排序的过程当中老是小数往前放,大数日后放,相似于气泡逐渐向上漂浮,因此称做冒泡排序。segmentfault
Tips:蓝色表明在一轮排序中等待交换,黑色表明在该轮排序中已交换完成,红色表明已排序完成数组
因为待排序的序列只剩下一个数时已经可以肯定顺序,则无需进行排序,所以,排序次数为序列长度 – 1。性能
每次排序,序列中的多个数字要分别进行两两比较,屡次的比较须要利用for语句来进行实现。该for循环嵌套于排序次数的for循环当中(造成双for的嵌套)。优化
Tips:j 须要设置为小于 len - i - 1,减i的缘由是已经排序完成的数再也不参与比较,减1的缘由是数组下标索引值从0开始。网站
比较两数大小,若是前者比后者大,则进行数值的交换,也就是交换位置。spa
假如序列的数据为:[0, 1, 2, 3, 4, 5];
使用上面的冒泡排序法进行排序,获得的结果确定没有问题,可是,待排序的序列是有序的,理论上是无需遍历排序。
当前的算法无论初始的序列是否有序,都会进行遍历排序,效率会比较低,所以须要优化当前的排序算法。
在以下的算法中,引入一个swap变量,每一次排序以前初始化为false;若发生两数交换位置,则将其设置为true。
在每次排序结束时候判断swap是否为false,若是是,则说明序列已排序完成或者序列自己是有序序列,就再也不进行下一次排序。
经过此方法,减小没必要要的比较和位置交换,进一步提升算法的性能。3d
最佳状态:待排序的序列自己是有序序列,排序次数根据优化后的代码,能够得出是n-1次,时间复杂度为O(n);
最坏的状况:待排序的序列是逆序的,此时须要排序1 + 2 +3 ……(n - 1) = n(n – 1 )/2次,
时间复杂度为O(n^2)。blog
冒泡排序法须要一个额外空间(temp变量)来交换元素的位置,因此空间复杂度为O(1)。
当相邻元素相等时,并不须要交换位置,也就不会出现相同元素的先后顺序发生改变,因此,是稳定性排序。
时间复杂度,更准确的说该是描述一个算法在问题规模不断增大时对应的时间增加曲线。因此,这些增加数量级并非一个准确的性能评价,能够理解为一个近似值。(空间复杂度同理)
O(n²)表示当n很大的时候,复杂度约等于Cn²,C是某个常数,简单说就是当n足够大的时候,随着n的线性增加复杂度将沿平方增加。
O(n)表示,n很大的时候复杂度约等于Cn,C是某个常数。简言之:随着n的线性增加,复杂度沿线性级别增加。
O(1)表示,n很大的时候,复杂度基本就不增加了。简言之:随着n的线性增加,复杂度不受n的影响,沿常数级别增加(此处的常数是1)。
Tips:图中O(1)紧贴着X轴,并看不太清楚。
Tips:该图来源于“Stack Overflow”网站。
生活艰辛,代码不易,但,不要忘记微笑!
版权声明:该图来自“【美】莉兹·克里莫 (author)”的书籍《你今天真好看》