冒泡排序的三个版本:
-
先说最简单的排序,严格说不属于冒泡排序。
原理:
当i=0时,让arr[0](在第一位的数字)和后面每一位的数字比较。
若出现第一位的数字比其中一位大的时候,则和那一位数字交换位置。
当第一位数字和其他数字全部比较和互换结束,此时在第一位的数字就是数组中最小的。
然后当i=1时,让arr[1]和后几位再这样比较和互换,这样下来第二位就是除了第一位最小的了。
以此类推,就可以得到最后的排序,方法如下:function BubbleSort(arr){ var i,j,temp; for(i=0;i<arr.length-1;i++){ for(j=i+1;j<arr.length;j++){ if(arr[i]>arr[j]){ temp=arr[j]; arr[j]=arr[i]; arr[i]=temp; } } } return arr; } var arr=[15,3,83,10,18,99,4,63,28,47]; BubbleSort(arr);
-
正常的冒泡排序。
原理:
总体来说,正如其字面意思,将小的数字如同气泡一样慢慢的浮上表面。
若数组中有10个数字,先用arr[9] (最后一位的数字)和arr[8]比较大小,若arr[9]<arr[8],则互换位置,反之则位置不变。
再用arr[8]和arr[7]比较,使数字小的在前边。以此类推,这样就会把小的数字从后往前推。
直到arr[1]和arr[0]比较完,第一轮结束,此时arr[0]也就是第一位的数字是数组中最小的。
接下来排除第一位最小的,按同样的方法找到数组的第二位,此时第二位就是除了第一位最小的了。
以此类推,就可以得到最后的排序,方法如下:function BubbleSort(arr){ var i,j,temp; for(i=0;i<arr.length-1;i++){ for(j=arr.length-1;j>i;j--){ if(arr[j]<arr[j-1]){ temp=arr[j-1]; arr[j-1]=arr[j]; arr[j]=temp; } } } return arr; } var arr=[15,3,83,10,18,99,4,63,28,47]; BubbleSort(arr);
-
升级版冒泡排序。
原理:
在正常版本的冒泡排序中,若初始数组为var arr=[2,1,3,4,5,6,7,8,9]
,则第一轮过后就已经是最终排序,但还是要将后面的循环全部执行一遍。所以在升级版冒泡排序中添加了flag标记 。
若出现无论j的值是多少,if(arr[j]<arr[j-1])
条件都不符合,则循环会结束,函数计算完毕!
方法如下:function BubbleSort(arr){ var i,j,temp; var flag=true; //flag进行标记 for(i=0;i<arr.length-1&&flag;i++){ //若循环回来的flag为false则退出循环 flag=false; //初始化为false for(j=arr.length-1;j>i;j--){ if(arr[j]<arr[j-1]){ temp=arr[j-1]; arr[j-1]=arr[j]; arr[j]=temp; flag=true; //如果有数据交换则为true } } } return arr; } var arr=[15,3,83,10,18,99,4,63,28,47]; BubbleSort(arr);