排序学习

排序的学习(待补充)



冒泡排序

1. 正序

从尾部开始比较,小的则往上冒泡

function bubble(arr){                             
    for(i=0;i<arr.length-1;i++){
          for(j=arr.length-1;j>i;j--){    
                if(arr[j]<arr[j-1]){
                 [arr[j],arr[j-1]]=[arr[j-1],arr[j]]
                }
          }
    }
}

测试:

 var arr=[4,41,21,15,32,27,9,18]
     bubble(arr)
     console.log(arr)

输出结果如下:在这里插入图片描述

2. 逆序

与正序相反,将大的上浮即可

function rebubble(arr){                            
   for(i=0;i<arr.length-1;i++){
       for(j=arr.length-1;j>i;j--){
           if(arr[j]>arr[j-1]){
             [arr[j],arr[j-1]]=[arr[j-1],arr[j]]
           }
       }
   }
}

测试

var arr=[4,41,21,15,32,27,9,18]
    rebubble(arr)
    console.log(arr)

输出结果如下
在这里插入图片描述

思考:若数组相对有序,是否可以减少循环次数。

在第二层for循环外加入判断,出现后一项小于前一项时再进行内循环

var count=0
 function bubble(arr){                                
     for(i=0;i<arr.length-1;i++){
         if(arr[i]>arr[i+1]){
              for(j=arr.length-1;j>i;j--){
                 count++
                   if(arr[j]<arr[j-1]){
                    [arr[j],arr[j-1]]=[arr[j-1],arr[j]]
                   }
              }
         }
      }
 }
 
      var arr=[4,5,12,15,24,33,42]
       bubble(arr)
       console.log(count)
       console.log(arr)

当数组完全正序时,通过计数可知只循环arr.length次。

但数组完全正序的情况仅为特例。可以考虑插入排序

插入排序

  • 当数组规模小,且前段较有序时,效率较高。

个人理解:首先开始遍历第一层循环。从出现第一个无序排列的arr [ i ]开始,将arr [i]到arr [0]第二层循环,通过比较找到arr [ i ]的合适位置排好序再跳到第二层循环。(需保证j有项可比)

代码实现:

function insertSort(arr){
   for(i=1;i<arr.length;i++){
       if(arr[i]<arr[i-1]){
          var temp=arr[i]
            for(j=i;j>=0;j--){
                 if(temp<arr[j-1]&&j>0){
                      arr[j]=arr[j-1]
                 }else{
                     break
                 }
             }
        arr[j]=temp
        }
   }
}

测试:

var arr=[5,12,45,7,8,15]  
 insertSort(arr)
 console.log(arr)

输出结果:
在这里插入图片描述

但数组相对大且混乱时,使用插入排序效果便不尽人意。

快速排序

当数组较大且乱时,使用快速排序效率高
实现思想

  1. 取一个基准数
  2. 将数组按基准数分为左半边和右半边,左边<基准数,右边>基准数
  3. 对左半边和右半边再次进行1,2步操作
  4. 直到排序完成
function quickSort(arr){
   function $quicksort(left,right){
             if(left<0||right>arr.length-1||left>=right){
                 return;                                 //确保可以分为两部分
             }
     var key=arr[right]                                //取一个基准数,常取最后一位数
     var low=left ,high=right                     //“low指”找左半边,“high指”找右半边,保证left与right定值           
        while(low<high){
                while(arr[low]<key&&low<high){
                    low++
                }                               //跳出该循环时即为low位上的值大于key值,将其赋予high,high再向左移
        arr[high]=arr[low]
                while(arr[high]>key&&low<high){
                    high--
                } 
         arr[low]=arr[high]                     //跳出该循环时即为high位值大于key值,将其赋予low,low再开始右移
         }

             arr[low]=key                                 //当low和high重合时,此位即为 key位
             $quicksort(left,high-1);                       //对左半边再次分类
             $quicksort(high+1,right);                     //对右半边再次分类
        }
 $quicksort(0,arr.length-1);                        //第一步使用此法
} 

测试:

var arr=[8,45,12,2,49,135,4,6,15]
quickSort(arr)
console.log(arr)

输出结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值