• 常用排序算法


    
    

    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)); //递归调用继续一分为二排序 }
    以上皆为个人理解,如有错误之处,欢迎留言指正。
  • 相关阅读:
    layDate关闭方法
    iOS Crash日志符号化
    图像压缩工具ImageOptim介绍
    UITextField设置光标位置
    Detect backspace in UITextField
    scrollsToTop小结
    查看UIWindows的视图层次
    弹出框适配总结
    关于IOS获取keyBoard键盘是否弹出
    UItableViewCell滑动删除时,调整cell子视图的位置大小
  • 原文地址:https://www.cnblogs.com/kevin2chen/p/6366013.html
Copyright © 2020-2023  润新知