原理:
比较相邻元素,如果是排序冒泡,如果j大于j+1的,那就互换;降序则是j小于j+1,那就互换。
既然是相互比较,那一定是两两比较,内外循环。如果只有一个for循环,那么换到的只是一次。显然不符合最终结果。
那么,外层循环应该多少次才是最佳的呢?由于是j 和 j+1相比较,也就是当前元素跟当前元素后一位的这个元素相互比较,那么外层循环可以循环比数组长度少1次,表达如下:
for (let i = 0; i < arr.length - 1; i ++) {}
接下来要考虑内层应该怎么循环?如何循环才是最佳不浪费内存的?
可能会想到,有多少个循环多少个
for (let j = 0; j < arr.length; i++) {}
由于是j 和 j+1的比较, 为了以防undefined这种情况,调整一下内循环
for (let j = 0; j < arr.length; i++) {}
但这个还不是最佳的,因为每一次互换,倒数第i个就是已经是固定好位置了,也就是倒数第i个一定是比倒数第i-1个小(或者是大,看是小于号还是大于号)(除了第1次)。所以,再次调整一下内循环,以得到最佳的循环
for (let j = 0; j < arr.length - 1 - i; j++) {}
最终答案是:
function Bubble (arr) {
let temp
for (let i = 0; i < arr.length - 1; i++) {
for (let j = 0; j < arr.length - 1 - i; j++) {
// 这里比较>代表asc升序冒泡(从小到大), <代表desc降序冒泡(从大到小)
if (arr[j] > arr[j + 1]) {
temp = arr[j + 1]
arr[j + 1] = arr[j]
arr[j] = temp
}
}
}
return arr
}
至此手写冒泡结束。