冒泡排序算法
冒泡排序
什么是冒泡排序呢?冒泡排序的英文名称是Bubble Sort,Bubble的发音跟我们吐泡泡的声音很相近。那么这个排序算法为什么会取名为冒泡排序呢?
其实来自于我们日常中的一种现象,我们都可以发现在可乐中有很多的小气泡其实也就是二氧化碳,由于这些二氧化碳比水轻,所以这些小气泡会不断的往上冒,而我们这种排序算法中的元素,和这些小气泡一样,会根据自身的大小,在数列中进行移动。
那么我们知道冒泡排序这个名字的来源了,那么冒泡排序的原理是什么呢?
冒泡排序的实现原理:它会重复扫描需要排序的元素列,并比较相邻的元素,当相邻的两个元素顺序错误的时候会交换位置,一直重复这个过程,直到没有相邻元素需要交换为止,也就是说该元素列已经排序完成了。
接下来我们来看一看例子:
实例
有这样七个数,组成了一个无序数列2,5,3,2,8,6,8。希望按照从小到大进行排序。根据冒泡排序的实现原理,我们进行两两比较并交换顺序,具体的实现过程。
待排数列:2,5,3,2,8,6,8
第一轮排序:
第一次比较 2,5,3,2,9,6,8————2,5,3,2,9,6,8
第二次比较2,5,3,2,9,6,8————2,3,5,2,9,6,8
第三次比较2,3,5,2,9,6,8————2,3,2,5,9,6,8
第四次比较2,3,2,5,9,6,8————2,3,2,5,9,6,8
第五次比较2,3,2,5,9,6,8————2,3,2,5,6,9,8
第六次比较2,3,2,5,6,9,8————2,3,2,5,6,8,9
通过第一轮排序我们选出来了,一个最大的数9.
那么第二轮排序只需要进行五次比较
第二轮排序结果:2,2,3,5,6,8,9。这个时候我们发现数列已经按照从小到大进行了排序,已经没有相邻元素可以进行交换的了,那么排序就已经结束了。
如果按照最坏的情况,冒泡排序一共要进行(n-1)次循环,每一次循环都要进行当前n-1次比较
所以一共的比较次数是:
(n-1) + (n-2) + (n-3) + … + 1 = n*(n-1)/2;
这儿就涉及到了时间复杂度的问题,我么你下面来看一看什么是时间复杂度。
时间复杂度
什么是时间复杂度呢?通俗说时间复杂度就是你做完一件事情理论上需要的时间。放到算法中来讲考虑的是当输入项为无穷大时,该算法运行的时间。
例如:
现在David有一本书,总共300页,David每天看30页,那么看完这一本书需要多少天?
通过简单的计算300/30=10天。
那如果说书本的页数是N?
那么看完这本书需要的天数就是N/30天
用一个函数表达式来表达这个相对时间的话,T(N)=N/30.
同样的道理,我们运用到冒泡排序中,在一个元素个数为n的数列中,进行冒泡排序的次数为(n-1) + (n-2) + (n-3) + … + 1 = n*(n-1)/2;
那么到n趋近于无穷大的时候,冒泡排序的时间复杂度为O(n2)。
JavaScript代码 冒泡排序
<script type="text/javascript"> //申明一个数组 var arr=[2,1,3]; οnlοad=function(){ //冒泡排序,从小到大 for(var i=0;i<arr.length-1;i++){ for(var j=0;j<arr.length-1-i;j++){ if(arr[j]-arr[j+1]>0){ var t=arr[j]; arr[j]=arr[j+1]; arr[j+1]=t; } } } alert(arr); }; </script>