做了三四年前端了,为了自己的事情在学java,昨晚上突然卡壳在了冒泡排序上,觉得无法理解了。看来这几年做久了api调用工程师,基础算是全部忘了,每个语言的冒泡排序都是一个原理!!看了很多帖子,越看越糊涂了!哎!还是自己来理解吧。如果谁觉得不对希望帮我指点下。
排序前理解互换
var a = 10, b = 20, temp;
temp = a;
a = b;
b = temp;
console.log(a)
console.log(b)
// 20
// 10
数组从小到大的排序
var array = [90, 0, 1, -9, 10]
for (var i = 0; i < array.length; i++) {
console.log("外循环第" + (i+1) + "次")
for (var j = 0; j < array.length; j++) {
console.log("内循环第" + (j+1) + "次")
console.log("array[i]值 = " + array[i])
console.log("array[j]值 = " + array[j])
var flag = array[i] < array[j]
console.log("对比后结果 = " + flag)
if(array[i] < array[j]) {
var temp = array[i]
array[i] = array[j]
array[j] = temp
console.log("array[i]交换后值 = " + array[i])
console.log("i="+i+",j="+j+",数组="+array)
}
}
}
console.log("排序完成的数组:"+array)
外循环第1次,array[i] = 90
内循环第1次
array[i]值 = 90
array[j]值 = 90
对比后结果 = false
内循环第2次
array[i]值 = 90
array[j]值 = 0
对比后结果 = false
内循环第3次
array[i]值 = 90
array[j]值 = 1
对比后结果 = false
内循环第4次
array[i]值 = 90
array[j]值 = -9
对比后结果 = false
内循环第5次
array[i]值 = 90
array[j]值 = 10
对比后结果 = false
解释:条件全部为false,所以数组不会发生任何改变。还是
[90, 0, 1, -9, 10]
外循环第2次, i = 1; array[i] =0;array = ``[90, 0, 1, -9, 10]```
内循环第1次
array[i]值 = 0
array[j]值 = 90
对比后结果 = true
array[i]交换后值 = 90
***这里很关键,很关键:
***交换后的值变成了array[j]的值,也就是90,当继续内循环的时候,你记住了
***array[i]已经不是0,而是90了。
i=1,j=0,数组=0,90,1,-9,10
内循环第2次
array[i]值 = 90 // 是对比的90不是0了哦。
array[j]值 = 90
对比后结果 = false
内循环第3次
array[i]值 = 90
array[j]值 = 1
对比后结果 = false
内循环第4次
array[i]值 = 90
array[j]值 = -9
对比后结果 = false
内循环第5次
array[i]值 = 90
array[j]值 = 10
对比后结果 = false
解释:仔细理解我备注的很关键很关键部分。经过第二轮后数组现在是
[0,90,1,-9,10]
最关键最关键最关键的理解来了,
循环时数组改变了那么就算循环没执行完,他会认改变后的数组而不会认原始形态的数组。
循环中改变了数组会影响获取值
var arr = [1,2,3,4,5] // 原始数组
for (var i = 0; i < arr.length-1; i++) {
arr[i+1] = arr[i] // 我们循环改变了数组后面一个值
console.log(arr[i]) // 如果原始数组不会改变那么应该是打印1,2,3,4
}
// 实际打印结果
//1,1,1,1
外循环第3次, i = 2; array[i] =1;array = ``[0,90,1,-9,10]```
内循环第1次
array[i]值 = 1
array[j]值 = 0 // 所以此时此刻j = 0 ,array[j] = 0
对比后结果 = false
内循环第2次
array[i]值 = 1
array[j]值 = 90
对比后结果 = true
array[i]交换后值 = 90
i=2,j=1,数组=0,1,90,-9,10
内循环第3次
array[i]值 = 90
array[j]值 = 90
对比后结果 = false
内循环第4次
array[i]值 = 90
array[j]值 = -9
对比后结果 = false
内循环第5次
array[i]值 = 90
array[j]值 = 10
对比后结果 = false
解释:最难理解的还是为true的时候,array[i] = 90 了。所以继续内循环的时候又都变成了false。##### 外循环第3次,array[i] = 1
外循环第4次,i = 3; array[i] = -9;array = [0, 1, 90, -9, 10]
内循环第1次
array[i]值 = -9
array[j]值 = 0
对比后结果 = true
array[i]交换后值 = 0
i=3,j=0,数组=-9,1,90,0,10
内循环第2次
array[i]值 = 0
array[j]值 = 1
对比后结果 = true
array[i]交换后值 = 1
i=3,j=1,数组=-9,0,90,1,10
内循环第3次
array[i]值 = 1
array[j]值 = 90
对比后结果 = true
array[i]交换后值 = 90
i=3,j=2,数组=-9,0,1,90,10
内循环第4次
array[i]值 = 90
array[j]值 = 90
对比后结果 = false
内循环第5次
array[i]值 = 90
array[j]值 = 10
对比后结果 = false
解释:对比上面的条件为true的理解应该不难了吧!
外循环第5次,i = 4;array[i] = 10;array = [-9, 0, 1,90, 10]
内循环第1次
array[i]值 = 10
array[j]值 = -9
对比后结果 = false
内循环第2次
array[i]值 = 10
array[j]值 = 0
对比后结果 = false
内循环第3次
array[i]值 = 10
array[j]值 = 1
对比后结果 = false
内循环第4次
array[i]值 = 10
array[j]值 = 90
对比后结果 = true
array[i]交换后值 = 90
i=4,j=3,数组=-9,0,1,10,90
内循环第5次
array[i]值 = 90
array[j]值 = 90
对比后结果 = false
排序到此完成
最终数组: [-9,0,1,10,90 ]
很凝重的表情,你们理解了吗!!!
网友评论