冒泡排序的简单讲解

60 阅读3分钟

/**

* 冒泡排序

    */

    var arr = [9, 8, 7, 6, 5, 4, 3, 2, 1]
    //         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 - k; i++) {
            if (arr[i] > arr[i + 1]) {
                var temp = arr[i]
                arr[i] = arr[i + 1]
                arr[i + 1] = temp
            }
        }
    }






    /**
     *  优化3
     * 
     *      我们对比后发现每一轮外层循环之后完毕之后, 就可以确定一个数字(最大值已经放在最后了)
     * 
     *      第 1 次执行, k === 0, 没有确定的数字
     *      第 2 次执行, k === 1, 最后 1 位的值已经确定了 (9)
     *      第 3 次执行, k === 2, 最后 2 位的值已经确定了 (8, 9)
     *      第 4 次执行, k === 3, 最后 3 位的值已经确定了 (7, 8, 9)
     *      第 5 次执行, k === 4, 最后 4 位的值已经确定了 (6, 7, 8, 9)
     *      第 6 次执行, k === 5, 最后 5 位的值已经确定了 (5, 6, 7, 8, 9)
     *      ......
     * 
     *      结合上述的规律我们能够发现, 每一轮外层循环执行完毕, 数组内都能多一个没必要参与冒泡对比的数字
     * 
     *      又因为内层循环是控制我们的冒泡对比执行多少次的, 所以我们将 内层循环 - k
     *      目的是为了减少对比次数, 优化运行效率
    */
    // for (var k = 0; k < arr.length - 1; k++) {
    //     for (var i = 0; i < arr.length - 1 - k; i++) {
    //         console.log('当前是第', k + 1, '次循环(外循环), 当前对比的是', arr[i], arr[i + 1], '当前k的值: ', k)
    //         if (arr[i] > arr[i + 1]) {
    //             var temp = arr[i]
    //             arr[i] = arr[i + 1]
    //             arr[i + 1] = temp
    //         }
    //     }
    //     console.log('当前循环执行完毕后的数组: ', arr)
    //     console.log('======================================================')
    // }






















    /**
     *  优化2
     * 
     *      内层循环 - 1 的原因
     *          在当前案例中, arr.length === 9
     * 
     *          所以 i 的最大值为 8, 因此最后一轮对比的时候是 arr[8] 和 arr[9]  做对比
     *          数组中其实是没有 [9] 的, 所以最后一轮对比没有意义
     * 
     *          因此我们减少一轮对比
    */
    // 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
    //         }
    //     }
    // }
    // console.log(arr)

































    /**
     *  优化1
     * 
     *      外层循环 - 1 的原因:
     *          如果不减1我们会发现, 执行到倒数第二轮的时候, 就剩下一个数字和一个位置没有做冒泡对比了
     * 
     *          但是这个时候其实就没有必要做对比了, 因此, 我们省略了最后一次的冒泡对比
    */
    // for (var k = 0; k < arr.length - 1; 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('第 ', k, ' 轮循环执行完毕后: ', arr)
    // }
    // console.log('冒泡排序后的数组: ', arr)






















    // 基本写法
    // 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
    //         }shu
    //     }
    //     // console.log('第 ', k, ' 轮循环执行完毕后: ', arr)
    // }
    // console.log('冒泡排序后的数组: ', arr)