一篇文章彻底搞懂javascript冒泡排序

116 阅读1分钟

冒泡排序:相邻两项比较:i项 i+1项 (如果i项比i+1项大)=> 交换位置

image.png

上图可以看出第一轮排序排的是5

image.png

上图可以看出第二轮排序排的是4

image.png

上图可以看出第三轮排序排的是3

image.png

上图可以看出第四轮排序排的是2

image.png

上图可以看出第五轮排序排的是1

ok,由此可以总结出,一共对比了五轮,那么这五轮是怎么来的呢,实际上取的是数组中的每一项,每一轮当中会进行四次对比,为什么会进行四次对比,因为只有五个元素,相邻两项进行对比,最后一项不需要对比,所以只会进行四次对比。ok 贴代码

function toSort(arr) {
    let length = arr.length
    for(let i = 0; i < length; i++) { // 每一轮的轮数,循环的轮数
        for(let j = 0; j < length - 1; j ++) { // 当前对比的次数
            /**
               ok,看到这里可能有些大兄弟懵了,抓胸挠头,默默的点上了一根烟,骂了句grass,为什么要-1?
               如果不-1,比如数组中有两项let arr = [2,3],此时的arrlength是2 arr[0] 和 arr[1] 进行对
               比,ok,这一轮对比完,开始arr[1] 和 arr[2] 进行对比,arr[2]根本不存在,由此可以看出为
               什么会-1 因为最后一项根本不需要对比
            */
            
            if(arr[j] > arr[j + 1]) {
                [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]
            }
        }
    }
    
    return arr;
}
toSort([5,4,3,2,1])

ok,上面代码已经可以看出结果。

接下来咱们进行优化。

function toSort(arr) {
    let length = arr.length
    for(let i = 0; i < length; i++) { // 每一轮的轮数,循环的轮数
        for(let j = 0; j < length - 1 - i; j ++) { // 当前对比的次数
             /**
              为什么这里又-i?
              5 跟 4 对比
              5 跟 3 对比
              5 跟 2 对比
              5 跟 1 对比
              此时 [4,3,2,1,5]
              
              4 跟 3 对比
              4 跟 2 对比
              4 跟 1 对比
              4 还需要跟5对比吗?
              此时 [3,2,1,4,5]
              
              3 跟 2 对比
              3 跟 1 对比
              3 还需要跟4对比吗?
              此时 [2,1,3,4,5]
              
              2 跟 1 对比
              2 还需要跟3对比吗?
              此时 [1,2,3,4,5]
              
              1 跟 2 对比
              此时 [1,2,3,4,5]
              
              实际上可以看出来,在每一轮循环当中,实际上没有必要再对比每一项。
            */
            
            if(arr[j] > arr[j + 1]) {
                [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]
            }
        }
    }
    
    return arr;
}
toSort([5,4,3,2,1])