思路:双重循环比较
1)从第一个数字开始扫描,并且比较第一个和第二个数字
1-1 如果第一个数字大于第二个数字,则交换位置
1-2 如果第一个数字小于第二个数字,则比较第二个和第三个数字,依次类推,直到最大的数字到最后一位,然后转回(1)。
比如:
5 4 3 2 1
经历过第一轮的bubble sort后应该是:
4 3 2 1 5
首先如果有N个数字,那我们只要进行N-1趟排序。
这个很好理解,如果只有2个数,那我们两个数对比一次就够了。同样的道理,如果有100000个数字,进行完第99999次后,最小的数字必然在第一个。
另外如果有N个数字,我们进行第一轮冒泡排序的时候,最大的数假设为A,已经处于最后一个,那我们接下来从第一个开始比较的时候,最后一个数字就没有必要再对比,我们设第几趟排序为C,所以第二次需要对比的数字个数就是:N-1-C。
接下来我们就可以编码了。这里为了方便就直接写了。
var bubbleSort=function(arr){
//第一重循环,i表示排序多少趟
for(var i=0;i<arr.length-1;i++){
//第二重循环,j表示从第一个开始比较多少个数字
// 如果有5个数字,那j到4就可以了
// 如果有10000个数字,那j到9999就可以了
// 这边下标和数字个数有点出入,所以有点难理解
// 假设有11个数字,第0趟,需要对比第一个开始到第11个,即对比10次,所以j应该小于11-1
// 第一趟,需要对比从第一个开始到第10个,即对比9次,所以j应该小于11-2
// 依次类推
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;
}
}
}
return arr;
};
var array=[10,9,8,7,6,5,4,3,2,1,0];
console.log(bubbleSort(array));
最后一张渣图是让我备忘的,大家请忽略。
i和j的关系.png
假设5个数字:
第0趟,第一个数字需要对比4次
第1趟,第一个数字需要对比3次
第2趟,第一个数字需要对比2次
第3趟,第一个数字需要对比1次
5个数字,总共需要4趟对比。
i和j的边界应该是:
i<arr.length-1
j<arr.length-1-i
网友评论