JS冒泡排序详解
原理:
依次比较相邻两个元素值的大小,如果前面的元素值比后面的值大,则将元素值小的元素排到前面。并依照这个规律进行多次递减判断,直到完成正确的排序。
冒泡排序代码如下:
// NZ203 加油!
var arr=[9,6,7,11,5,2,3,4,6,8,9,0];
function sorts(arr){
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]){
var temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
sorts(arr);
console.log(arr);
代码解析如下:
上面一共用到两个循环,一个i循环,一个j循环
简单说明一下两个循环的作用:
i循环作用是控制数组内的元素一共要比较多少次
j循环作用是控制相邻两个元素依次比较大小
当i=0的时候,里面的循环第一次完全执行,当j=0时判断arr[j]是否大于arr[j+1],此时j=0也就是判断arr的第0项是否大于arr的第1项,如果条件成立,则把arr第0项和arr第1项元素值进行互换,继续进行j的第二轮循环判断,如果条件不成立则不进行值互换,直接进行j的第二轮循环判断,这样就能够保证后面的元素值始终是较大的,然后等j循环全部执行后我们就能够把数组中元素值最大的元素给排序到数组的最后。此时arr数组通过断点查看为arr=[9,6,7,5,2,3,4,6,8,9,0,11];
当i=1的时候,里面的循环再次完整执行,就会判断arr的第1项和arr的第2项的大小,并把较大的元素排序到后面,此时由于i的上一轮循环已经把最大的元素排序到最后了,也就说我们没有必要再去比较数组的最后两项,所以当i每多循环一次,j就可以少循环一次,这也是为什么j的循环条件设置为j<arr.length-1-i的原因,这样写可以减少浏览器解析次数,从而提高代码执行效率。
说到这里,我们整个循环规律就清楚了,每次都将数组里剩下的最大元素依次排序排到最后面,当i循环全部执行完成时我们就会得到排序好的arr数组,执行函数,打印arr数组如下:
arr=[0,2,3,4,5,6,6,7,8,9,9,11],
像以上这种对数组依次比较相邻两个元素大小的的值并且将元素值较大的元素重复往后挪一位的排序方法就叫做冒泡排序。