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.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;
              }
          }
    //第一次结束以后,数组中的最后一个,就会是最大的那个数字

    **//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<arr.length-1;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;
                    }
                 }
             }
    **// 优化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);
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值