按照由小到大的顺序排列,冒泡排序基本步骤:
1、比较相邻两个数值的大小,将数值大的交换到数值小的后面,数据交换的时候需要1个临时变量空间;
2、对剩下的n-1个数值重复1的步骤,直到剩下的数值个数为1。
比如5,4,3,2,1的排序步骤如下:
第一遍:4、5、3、2、1; 4、3、5、2、1; 4、3、2、5、1; 4、3、2、1、5
第二遍:3、4、2、1、5; 3、2、4、1、5; 3、2、1、4、5
第三遍:2、3、1、4、5; 2、1、3、4、5
第四遍:1、2、3、4、5
时间复杂度为:
数据交换次数与时间复杂度一样。
当数据本身有序时如1、2、3、4、5,可以在以上的步骤进行优化,即在第一遍过程中发现没有数据发生交换就可以判断数据已经有序,此时的时间复杂度为N-1。当数据基本有序时如2、3、1、4、5,比较的次数永远都是上述最坏时间复杂度,但是数据交换的次数会少点。由于在绝大部分情况下,给定的数据极少是已经有序的,所以冒泡排序的平均时间复杂度是N*(N-1)/2
这里并没有用大O表示法,因为在实际的排序算法中,当数据个数到一定程度时会使用其它排序算法,比如在lucene中IntroSorter下,元素个数达到20的时候用二分插入排序,至于这个20是怎么来的,个人认为只有把完整的时间复杂度公式表达出来才能求出。
冒泡排序算法是稳定的,因为当相邻的数据相同时不会发生位置交换,即使不相邻的数据相同时也不会发生位置交换。
来源:oschina
链接:https://my.oschina.net/u/1268334/blog/2253110