js 冒泡

98 阅读1分钟

原理:

比较相邻元素,如果是排序冒泡,如果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
}

至此手写冒泡结束。