冒泡排序虽然已经学完了,但是再次去写的时候,总是写不出来,而且每次写的时候需求研究很久很久,对于 i < arr.length的理解也有问题,单独拿出时间来仔细研究一下.
我们把这个流程分成几步来做,能稍微简单的去理解他,实在记不住的…就死记吧…是固定的一个东西.
我们用函数实现一个数组从小到大的排序:[5,178,3,8,12,56,157]
第一步:我们首先实现的是把这个数组最大数放到数组的最后面
看代码:
<script>
function sort(arr) { //函数的名称为sort 形参是arr,arr就是调用时实参传递来的.
//首先来个循环把最大的数字排到最后面
for (var i = 0;i < arr.length - 1 ; i++) { //因为数组的下标是从0开始的,而数组长度是从1开始的,所以我们要给长度减1,去跟数组的下标对应起来.比如:数组长度是7,但是这个数组的下标最大是6,没有7.所以减去1对应上.
if (arr[i] > arr [i+1]) { //判断条件:如果数组arr的第i个元素比arr第二个元素i+1大.在这里i是0,所以就是:如果arr的第0个元素比arr第1个元素i+1大. 理解起来就是:0跟1比,符合条件就进去执行交换位置,1再跟2比,2再跟3比,3再跟4比...以此类推,交换位置后就跟下一个数比较.
//开始根据上面的判断条件进行位置的交换.
var temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
//交换位置的原理,是这样的:定义一个空的变量temp,交换位置时,把第0个元素放到temp,第1个元素放到0的位置,再把temp的元素放到第1个位置. 这样就实现了数值位置的变换
}
}
return arr;//函数返回值
}
console.log(sort([5,178,3,8,12,56,157]));//输出一下. 结果是: 5, 3, 8, 12, 56, 157, 178,最大的数值已经排到了数组的最后面.
</script>
因为上面的代码是只实现了数组里面的一个数的排序,我们循环length -1次,这里为什么是循环length -1次,因为最后一次是不需要循环的,前面的数字都排好以后,最后一次就是已经排好的.这里你也可以不减1,结果也是正确的,不知道为什么,估摸着可能是对性能有影响吧.
那我们最后就可以这样理解:
第一次循环的时候,内部循环把第一大的值放到了后面. 157
第二次循环的时候,内部循环把第二大的值放到了后面. 78
第三次循环的时候,内部循环把第三大的值放到了后面. 56
第四次循环的时候,内部循环把第四大的值放到了后面. 12
第五次循环的时候,内部循环把第五大的值放到了后面. 8
第六次循环的时候,内部循环把第六大的值放到了后面. 5
外面的循环每次循环都会把内部循环排好数输出来.
代码:
<script>
function sort(arr) {
for (var j = 0;j<arr.length - 1;j++) { //把内部循环排序好的数字,循环出来.
for (var i = 0;i < arr.length - 1 ; i++) {
if (arr[i] > arr [i+1]) {
var temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
}
return arr;
}
console.log(sort([5,178,3,8,12,56,157]));//输出一下. 结果是: [3, 5, 8, 12, 56, 78, 157]
</script>
这里有一个优化的地方:内部循环第一个循环,157已经排好了,第二次不需要循环了,内部第二次循环时,78已经排好了,也就是说,他其实每次循环只需要循环没有排好的数字就可以了,所以我们可以arr.length - j - 1就可以每次只循环没有排好的数字.
总起来就是:让外部循环每次循环就让内部循环减去不需要循环的次数.
<script>
function sort(arr) {
for (var j = 0;j<arr.length - 1;j++) { //把内部循环排序好的数字,循环出来.
for (var i = 0;i < arr.length - 1 - j ; i++) {
if (arr[i] > arr [i+1]) {
var temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
}
return arr;
}
console.log(sort([5,178,3,8,12,56,157]));//输出一下. 结果是: [3, 5, 8, 12, 56, 78, 157]
</script>
这就是整个冒泡循环的代码,可能有错误的地方,大家参考一下就好.