冒泡排序法就是将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其向上"飘浮"。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。
原始的冒泡排序法算法如下:
<script type="text/javascript">
var a = [0,2,4,1,5,3,9,10,8,6,7,13,12,11];;
var len = a.length;
var temp;
if(len>1){
while(len){
for(var i=len;i>=1;i--){
if(a[i]<a[i-1]){
temp = a[i-1];
a[i-1] = a[i];
a[i] = temp
}
}
len--;
}
}
</script>
当文件的初始状态是正序的,冒泡排序法最好的时间复杂度是O(n),一趟扫描即可完成排序。当初始文件是反序的,时间复杂度是最差的,需要 O(n2),要进行n-1趟排序。每趟排序要进行n-i次关键字的比较。
冒泡排序法还存在不对称性:例如
对初始关键字序列12,18,42,44,45,67,94,10就仅需一趟扫描。
对初始关键字序列:94,10,12,18,42,44,45,67就需七趟扫描。
这主要的因为每趟扫描仅能使最重的气球“下沉”一个位置,所以位于顶端的最重气泡下沉到底部需要做n-1趟扫描。
对冒泡排序的改进:
1.记住最后一下交换的位置
2.进行双向排序一解决不对称性
3,设置标识符,假如某一次扫描均无交换则表明已排序完
优化的冒泡排序法算法如下:
<script type="text/javascript">
var a = [0,2,4,1,5,3,9,10,8,6,7,13,12,11];
var high = a.length;
var low = 0 ;
var temp,lastExchange;
var exchange = true;
if(high>low){
var n = 0;
while(high>low&&exchange){
exchange = false;
for(var i=high;i>low;i--){
if(a[i]<a[i-1]){
temp = a[i-1];
a[i-1] = a[i];
a[i] = temp;
exchange = true;
lastExchange=i;
}
}
low = lastExchange;
if(high>low&&exchange){
exchange = false;
for(var i=low;i<high;i++){
if(a[i]>a[i+1]){
temp = a[i+1];
a[i+1] = a[i];
a[i] = temp;
exchange = true;
lastExchange=i;
}
}
}
high = lastExchange ;
}
</script>