常用排序算法


1.冒泡排序

外层循环控制坑位,内层循环控制找到合适的数,两者循环方向相反。

复制代码
function bubbleSort(arr){
    for(var outer=arr.length-1;outer>0;outer--){    //每次循环填好一个坑;剩最后一个数时(下标为0)不用比较
        for(var inner=0;inner<outer;inner++){    //找到合适的一个数,前后两个数比较;后面排好了的坑位不用循环
            if(arr[inner]>arr[inner+1]){        //是否交换
                var temp=arr[inner];
                arr[inner]=arr[inner+1];
                arr[inner+1]=temp;
            }
        }
    }
}
复制代码

2.选择排序

查找过程和冒泡排序相同,但交换次数会更少,性能更高。内外层循环方向相同。

复制代码
function selectionSort(arr){
     for(var outer=0;outer<arr.length;outer++){          //外层循环控制坑位,每次填一个坑位
        var tempPos=outer,temp;                   //通过内层循环找出当此循环的最小值;因为js变量作用域的原因,tempPos必须重新赋值
        for(var inner=outer+1;inner<arr.length;inner++){    //内部循环下标从外部循环坑位的后一个位置开始
            if(arr[inner]<arr[tempPos]){             //如果外循环的值大于内循环的值,说明有更小的值,就将该值的下标保存在临时变量中
                tempPos=inner;
            }
        }
        if(tempPos!=outer){                                        //内层循环结束,两个下标不一致时,将坑内的值和最小值交换一次就够了
            temp=arr[outer];                      
         arr[outer]=arr[tempPos];
         arr[tempPos]=temp; 
        }
  } 
} 
复制代码

 

3.插入排序

将无序的部分循环插入到有序的序列中,效率在这3者中最高。

复制代码
function insertionSort(arr){
  for(var outer=1;outer<arr.length;outer++){  //每次排序一个元素
    var inner=outer;
       var temp=arr[outer];
    while(temp<arr[inner-1]){      //之前的元素已经排好序。通过比较大小找到当前元素的正确位置;当前元素较小则之前的元素往后移动一格,直到将要排序的元素大于其值;最后在正确的位置上赋值。
      arr[inner]=arr[inner-1];    //较大数后移一位
      inner--;
    }
    arr[inner]=temp;
  }

}
复制代码

4.快速排序

对于大数据集处理最快

复制代码
function quickSort(arr){
    if(arr.length==0){                //递归结束条件
      return [];    
    }
    var left=[], right=[], devider=arr[0];
    for(var i=1;i<arr.length;i++){      //以devider为界分成2边
      if(arr[i]<devider){
      left.push(arr[i])   }
else{   right.push(arr[i])   } } return quickSort(left).concat(devider,quickSort(right)); //递归调用继续一分为二排序 }
复制代码

 

posted @   开发之路  阅读(205)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· 分享一个我遇到过的“量子力学”级别的BUG。
· Linux系列:如何调试 malloc 的底层源码
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
阅读排行:
· 对象命名为何需要避免'-er'和'-or'后缀
· JDK 24 发布,新特性解读!
· Java24你发任你发,我用Java8
· C# 中比较实用的关键字,基础高频面试题!
· .NET Core奇技淫巧之WinForm使用Python.NET并打包
点击右上角即可分享
微信分享提示