冒泡排序 实际案列 一看就会!

49 阅读2分钟

冒泡排序

    // 已知一个数组 利用冒泡排序处理
    //var arr = [7, 3, 6, 2, 4, 1, 8, 5, 0]
    

// 逐步分析后做优化

1 首先循环 遍历拿到数组中的所有数

方法1:
    for (var i = 0; i < arr.length; i++) {
    }
方法2:
     for (var i = 0; i <= arr.length-1; i++) {
    }
    
    这个很好理解吧!! 

2 然后在循环中需要做判断:

对比数组前一项和后一项 如果满足前一项大, 就往后挪 否则无操作
这里就是冒泡的思想 第一个数字循环和数组中其他所有数做一次判断

if (arr[i] > arr[i + 1]) {
            // 定义临时变量 给两个索引ii+1做交换 这里看不懂可以退出了~
    //         var temp = arr[i]
    //         arr[i] = arr[i + 1]
    //         arr[i + 1] = temp
    //     }
    
    // 举例 :第一个和第二个值做交换

    // var temp = arr[0]
    // arr[0] = arr[1]
    // arr[1] = temp
    // console.log(arr)
    

然后我们得到

    利用for循环 和if() 可以实现 :
    // for (var i = 0; i < arr.length; i++) {
    //     if (arr[i] > arr[i + 1]) {
            //  给两个索引做交换 值也跟着交换
    //         var temp = arr[i]
    //         arr[i] = arr[i + 1]
    //         arr[i + 1] = temp
    //     }
    // }
    
    而我们目前循环只是把数组中的第一个数做了和其他数的一轮循环,此时我们需要给所有数字都做判断
    所以我们可以在外层再用一个循环  
    目的:给数组中的每个数字依次循环和其他数字做循环判断
    

外层循环:

        for (var k = 0; k < arr.length; k++) {

        }
    

// 合并后得到基础版

    //var arr = [7, 3, 6, 2, 4, 1, 8, 5, 0]
    
    // for (var k = 0; k < arr.length; k++) {
    
    //     for (var i = 0; i < arr.length; i++) {
    
    //         if (arr[i] > arr[i + 1]) {
    //             var temp = arr[i]
    //             arr[i] = arr[i + 1]
    //             arr[i + 1] = temp
    //         }
    
    //     }
    
    // }
   
    // console.log('原始数组: ', arr)

// 优化1

    一轮中单个数字循环比较到 倒数第二项时 最后一次比较 就没有意义了 因为已经确定了其位置
    
    // for (var k = 0; k < arr.length; k++) {
    //     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
    //         }
    //     }
    // }

// 优化2

    /**
     *  k == 01 次循环 确定了 [8] 的值
     *  k == 12 次循环 确定了 [7][8] 的值
     *  k == 23 次循环 确定了 [6][7][8] 的值
     *  k == 34 次循环 确定了 [5][6][7][8] 的值
     *  k == 45 次循环 确定了 [4][5][6][7][8] 的值
     *  k == 56 次循环 确定了 [3][4][5][6][7][8] 的值
     *  k == 67 次循环 确定了 [2][3][4][5][6][7][8] 的值
     *  k == 78 次循环 确定了 [1][2][3][4][5][6][7][8] 的值
     *  k == 89 次循环 确定了 [0][1][2][3][4][5][6][7][8] 的值
    */
    // for (var k = 0; k < arr.length - 1; k++) {
    //     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
    //         }
    //     }
    // }

// 优化3

    // for (var k = 0; k < arr.length - 1; k++) {
    //     console.log(`这是第 ${k + 1} 轮循环(k == ${k})`)
    //     for (var i = k+1; i < arr.length - 1 - k; i++) {
    //         console.log(arr[i], arr[i + 1])
    //         if (arr[i] > arr[i + 1]) {
    //             var temp = arr[i]
    //             arr[i] = arr[i + 1]
    //             arr[i + 1] = temp
    //         }
    //     }
    // }
    // console.log('冒泡排序结束后的arr: ', arr)