冒泡和选择排序

冒泡排序

  • 思路

    • 1 先遍历数组,让挨着的两个进行比较,如果前一个比后一个大,就把两个换个位置
    • 2 数组遍历一遍以后,最后一个数组就是最大的那个了
    • 3 然后进行第二轮遍历,还是按照之前的规则,第二大的数字就会跑到倒数第二的位置
    • 4 依次类推,最后就会按照顺序排好了
  • 准备工作1:准备一个乱序的数组

    var arr = [3,1,5,6,9,7,2,8]
    
  • 准备工作2:如何调换两个数组元素的内容:arr[0]和arr[1]调个位置

      var temp = arr[0];//temp = 3;
      arr[0] = arr[1];
      arr[1] = temp;
    
  • 准备工作3:第一次遍历数组,把最大的放到最后面去

    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;
        }
     }
    // 数组遍历一遍以后,最后一个数组就是最大的那个了
    
  • 准备工作4:按照数组成都来遍历多少次

       for(var j=0;j<arr.length;j++){
           // j表示遍历的次数,从0开始
          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;
               }
           }
       }
    
  • 收尾工作5:给一些优化

    // 优化1:假设数组长度是8,其实第七次就排好了:j遍历的时候:for(var j=0;j<arr.length-1;j++)
    for(var j=0;j<arr.length-1;j++){
        // 优化3:每一轮都要比:arr.length-1次,如果某一轮,一个位置都没换,说明已经拍好了,后面的轮数就不需要了
        var num = 0;
        // 优化2:在同一轮遍历的时候,倒数第二个和倒数第一个比完了就结束了
        // 优化4:
        // 第j=0次后,最后一个就确定了,第j=1次的时候,最后一个就不用比了
        // 第j=1次后,倒数2个确定了,第j=2次的时候,最后二个就不用比了
        for(var i=0;i<arr.length-1-j;i++){
            // 判断:让挨着的两个进行比较,如果前一个比后一个大,就把两个换个位置
            if(arr[i]>arr[i+1]){
                num++;
                var temp = arr[i];
                arr[i] = arr[i+1];
                arr[i+1] = temp;
            }
        }
        if(num==0){
           break; 
        }
    }
    console.log(arr);
    

选择排序

  • 思路

    • 1 第一次遍历先假定数组中的第0个就是最小的数字的索引
    • 2 然后遍历数组,只要有一个数字比我小,那么就替换之前记录的索引
    • 3 直到遍历结束,就能找到最小的那个元素的索引,然后让最小元素换到第0个位置
    • 4 再来第二次遍历,假定第一个是最小的元素的索引
    • 5 再遍历一次数组,只要有一个数字比我小,那么就替换之前记录的索引
    • 6 遍历结束后换个位置
    • 7 依次类推,可以把数组排序好
  • 1 准备一个乱序的数组

        var arr = [3,1,5,6,9,7,2,8]
    
  • 2 第一次遍历先假定数组中的第0个就是最小的数字的索引

        var minIndex = 0;
    
  • 3 然后遍历数组,只要有一个数字比我小,那么就替换之前记录的索引

         for(var i=0;i<arr.length;i++){
             if(arr[i]<arr[minIndex]){
                 minIndex = i;
             }
         }
    
  • 4 遍历结束后换个位置

         var temp = arr[minIndex];
         arr[minIndex] = arr[0];
         arr[0] = temp;
    
  • 5 数组里面有多少个元素,就重复多少次2-4步骤

         // 倒数第二轮其实已经排好了,倒数第一个轮就不需要了
         for(var j=0;j<arr.length-1;j++){
             // 当前是第几轮,就假设最小值是第几个
             var minIndex = j;
             // 然后遍历数组,只要有一个数字比我小,那么就替换之前记录的索引
             for(var i=j+1;i<arr.length;i++){
                 if(arr[i]<arr[minIndex]){
                     minIndex = i;
                 }
             }
             if(minIndex!=j){
                 // 遍历结束后换个位置
                 var temp = arr[minIndex];
                 arr[minIndex] = arr[j];
                 arr[j] = temp
             }      
         }
         console.log(arr)
          arr[minIndex] = arr[j];
                 arr[j] = temp
             }      
         }
         console.log(arr)
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值