JS冒泡排序详细解读

            排序:就是把一个乱序的数组,通过我们的处理,让他变成一个有序的数组

            冒泡排序

                ==>先遍历数组,让挨着的两个进行比较,如果前一个比后一个大,那么就把两个数据换个位置

                ==>数组遍历一遍以后,那么最后一个数字就是最大的那个了

                ==>然后进行第二遍遍历,还是按照之前的规则,第二大的数字就会跑到倒数第二个位置了

                ==>以此类推,最后就会按照顺序把数组排好了

         1 先准备一个乱序的数组

        var arr = [3, 1, 5, 6, 4, 9, 7, 2, 8];

         2 先不急着循环,先来看数组里面内容换个位置,例如换:arr[0]和arr[1]

        var temp = arr[1];

         arr[1] = arr[0];

         arr[0] = temp;

        // 3 第一次遍历数组,把最大的放到最后面去

         for(var i=0;i

             //每次都是当前一个和后一个比,所以最后一个比较就是:

             //arr[arr.length-2]和arr[arr.length-1]比

             //判断,如果数组中的当前一个比后一个大,那么两个交换一下位置

            if(arr[i]>arr[i+1]){

              var temp = arr[i];

                arr[i] = arr[i+1];

                arr[i+1] =temp;

             }

         }

        //第一次结束以后,数组中的最后一个,就会是最大的那个数字

        //4 然后我们把上面的代码执行多次,数据有多少项就执行多少次

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

            for (var i = 0; i < arr.length - 1; i++) {

                //每次都是当前一个和后一个比,所以最后一个比较就是:

                //arr[arr.length-2]和arr[arr.length-1]比

                //判断,如果数组中的当前一个比后一个大,那么两个交换一下位置

                if (arr[i] > arr[i + 1]) {

                    var temp = arr[i];

                    arr[i] = arr[i + 1];

                    arr[i + 1] = temp;

                }

            }

        }

        /* 

        给一些优化

            1 想象一个问题,假设数组长度是9,第八次排完以后,后面8个数字已经按照顺序排好了,剩下的那个最小的,一定是在最前面,那么第九次就已经没有意义了,因为最小的已经在前面了,不会再有任何换位置出现了

            2 第一次的时候,已经把最大的数字放在最后面了, 那么第二次的时候,其实倒数第二个和倒数最后一个就不用比了, 因为我们就是要把倒数第二大的放在倒数第二的位置,即使比较了, 也不会换位置。第三次就要倒数第三个数字就不用再和后两个比较了。 以此类推,那么其实每次遍历的时候,就遍历当前次数-1

             至此,冒泡排序就完成了

        */

        // 优化1以后的结果

         for(var j=0;j

             for(var i=0;i

                //每次都是当前一个和后一个比,所以最后一个比较就是:

                //arr[arr.length-2]和arr[arr.length-1]比

                //判断,如果数组中的当前一个比后一个大,那么两个交换一下位置

                if(arr[i]>arr[i+1]){

                    var temp = arr[i];

                     arr[i] = arr[i+1];

                     arr[i+1] =temp;

                }

             }

         }

        // 优化2以后的结构

         for (var j = 0; j < arr.length - 1; j++) {

             for (var i = 0; i < arr.length - 1 - j; i++) {

                 //每次都是当前一个和后一个比,所以最后一个比较就是:

                //arr[arr.length-2]和arr[arr.length-1]比

                 //判断,如果数组中的当前一个比后一个大,那么两个交换一下位置

                if (arr[i] > arr[i + 1]) {

                    var temp = arr[i];

                     arr[i] = arr[i + 1];

                     arr[i + 1] = temp;

                 }

             }

         }

        // 优化3 可能出现还没完全比较完便已经正确

        var flag = 0;       // 统计一共要进行多少次外层for循环

        var arr = [3, 1, 5, 6, 4, 9, 7, 2, 8];

        for (var j = 0; j < arr.length - 1; j++) {

            var count = 0;       // 统计arr[i] < arr[i+1] 的次数

            for (var i = 0; i < arr.length - 1 - j; i++) {

                if (arr[i] > arr[i + 1]) {

                    var temp = arr[i + 1];

                    arr[i + 1] = arr[i];

                    arr[i] = temp;

                } else {

                    count++;     //    每当arr[i] < arr[i+1] 的时候,次数+1

                }

            }

            if (count == arr.length - 1 - j) {

                break;       //    当arr[i] < arr[i+1] 的次数 等于 所有比较次数的时候,此时排序已经完全正确,可直接结束

            }

            count = 0;     //    每次外层for循环结束都要重置次数

            flag++;    //  每进行一次外层for循环,便记录1次(放在外层for循环的末尾时,则不会加上最后一次外层for循环检测到完全正确时的情况)

        }

        console.log(arr);

        console.log(flag);

你可能感兴趣的:(JS冒泡排序详细解读)