冒泡排序是一种计算机科学领域的较简单基础的排序算法。其基本思路是,对于一组要排序的元素列,依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面,如此继续,直到比较到最后的两个数,将小数放在前面,大数放在后面,重复步骤,直至全部排序完成。
15 – 26 – 58 – 45 – 24 – 6 – 1
两两相互比较,小的放在前面,大的放在后面
第一轮:共比较6次
第二轮:共比较5次,最后组已经确定为最大,所以在第一轮的前提上少一轮,故此5次比较,
共减少1次比较
第三轮:共比较4次,最后两组已经确定由小到大,所以在第二轮的基础上再次减少一次比较。
共减少2次比较
**第四轮:**共比较3次,最后三组已经十分确定大小,所以在第三轮的基础上再次减少一次比较。
共减少3次比较
第五轮:共比较2次,最后四组已经确定大小,所以在第四轮的基础上再次减少一次比较。
共减少4次比较
第六轮:比较1次,后五组已经确定大小,所以在第五轮的基础上再次减少一次比较。
共减少5次比较
1.自第二轮开始,最后一个数组已经确定为最大值,所以没有必要在去进行排序。故每次排序都比上一次排序减少一次。
1.定义一个数组
var arr=[15,26,58,45,24,6,1];
2.确定循环轮数 (i)
具数组分析,共7个数值,循环6次。
也就是说数组里的数值为n个,则需要循环n-1次。
for(var i=1 ;i<arr.length;i++) //arr.lenth =7
所以说这个循环可以循环6次。
3.确定两两比较的次数。(j)
具上图分析,
第一轮,需要6次比较,全部比较
第二轮,需要5次比较,相比上一轮,少比较一次。
第三轮,需要4次比较,相比上一轮,少比较二次。
那么得出结论,
弟i轮的时候,需要比较(数组长度-i)次。
for(var j=1;j<=arr.length-i;j++)
OR
for(var j=0;j<arr.length-i;j++)
4.进行比较
if(arr[j-1]>arr[j]){
[arr[j-1],arr[j]]=[arr[j],arr[j-1]];
}
如果前一个数值,大于第二个数值。那么它俩互换位置。
5.整合代码
当进行第一轮比较时,需要进行完六次数值之间的比较,才能进行下一轮。
也就是说,轮数比较应该将数值比较包涵在内。
//定义一个数组
var arr=[15,26,58,45,24,6,1];
for(var i=1 ;i<arr.length;i++){ //排序轮数循环
for(var j=1;j<=arr.length-i;j++){ //数值两两比较的次数
//判断比较数值的大小
if(arr[j-1]>arr[j]){
[arr[j-1],arr[j]]=[arr[j],arr[j-1]];
}
}
}
-------------------------------------------有话想说-------------------------------------
多尝试几组数组之间的排序,重新推导一遍更有助于理解冒泡排序。