• 简单的排序算法总结


    1、冒泡排序

    let arr =[9,8,11,1,30]
    function bubble_sort(arr){
        let swap  
        for(let i=0;i<arr.length-1;i++){
            for(let j=0;j<arr.length-i-1;j++){
                if(arr[j]>arr[j+1]){
                    swap=arr[j]
                    arr[j]=arr[j+1]
                    arr[j+1]=swap
                }
            }
        }
    }
    bubble_sort(arr)   
    console.log(arr) //[1, 8, 9, 11, 30]
    

    2、快速排序

    let arr =[9,8,11,1,30]
    function quick_sort(arr){
        if(arr.length<=1){
            return arr;
        }
        const pivotIndex=Math.floor(arr.length/2);
        const pivot=arr.splice(pivotIndex,1)[0];
    
        const left=[];
        const right=[];
        for(let i=0;i<arr.length;i++){
            if(arr[i]<pivot){
                left.push(arr[i]);
            }else{
                right.push(arr[i]);
            }
        }
    
        return quick_sort(left).concat([pivot],quick_sort(right));
    }
    console.log(quick_sort(arr))   //[1, 8, 9, 11, 30]
    console.log(arr) //[9, 8, 1, 30]
    

    3、选择排序

    let arr =[9,8,11,1,30]
    function selection_sort(arr) {
      var len = arr.length;
      var minIndex, swap;
      for (let i = 0; i < len - 1; i++) {
        minIndex = i;
        for (let j = i + 1; j < len; j++) {
          if (arr[j] < arr[minIndex]) { //寻找最小的数
            minIndex = j; //将最小数的索引保存
          }
        }
        swap = arr[i];
        arr[i] = arr[minIndex];
        arr[minIndex] = swap;
      }
      return arr;
    }
    console.log(selection_sort(arr))   //[1, 8, 9, 11, 30]
    console.log(arr) //[1, 8, 9, 11, 30]
    

    4、插入排序

    let arr =[9,8,11,1,30]
    function insertion_sort(arr) {
      for (var i = 1; i < arr.length; i++) {
        var key = arr[i];
        var j = i - 1;
        while ( arr[j] > key) {
          arr[j + 1] = arr[j];
             j--;
        }
        arr[j + 1] = key;
      }
      return arr;
    }
    console.log(insertion_sort(arr))   //[1, 8, 9, 11, 30]
    console.log(arr) //[1, 8, 9, 11, 30]
    

    5、希尔排序

    let arr =[9,8,11,1,30]
    function shell_sort(arr) {
      var len = arr.length,
      temp,
      gap = 1;
      while(gap < len/5) { //动态定义间隔序列
        gap =gap*5+1;
      }
      for (gap; gap > 0; gap = Math.floor(gap/5)) {
        for (var i = gap; i < len; i++) {
          temp = arr[i];
          for (var j = i-gap; j >= 0 && arr[j] > temp; j-=gap) {
            arr[j+gap] = arr[j];
          }
          arr[j+gap] = temp;
        }
      }
      return arr;
    }
    console.log(shell_sort(arr))   //[1, 8, 9, 11, 30]
    console.log(arr) //[1, 8, 9, 11, 30]
    

    6、桶排序

    //桶排序
    function bucketSort(ary, bucketCount) {
      //类型检查
      if (!isArray(ary)) return false;
      if (ary.length <= 1) return ary;
    
      //初始化变量参数
      bucketCount = bucketCount || 5;
      var len = ary.length,
        buckets = [], //桶数组
        max = min = ary[0], //默认取出首位
        space, //数值范围
        i;
    
      //找出最大值最小值
      for (i = 1; i < len; i++) {
        min > ary[i] && (min = ary[i]);
        max < ary[i] && (max = ary[i]);
      }
    
      //求出每一个桶的数值范围(向下取值并且加一),范围取值(min -> >=max)
      space = Math.floor((max - min) / bucketCount) + 1;
    
      //将数值装入桶中
      for (i = 0; i < len; i++) {
        var item = ary[i], //值
          index = Math.floor((item - min) / space), //难点一,找到相应的桶序列
          bucket = buckets[index]; //桶序列数组
    
        //判断是否有对应桶
        if (bucket) {
          //因为数组从小到大排列
          var bucketLen = bucket.length - 1;
    
          //难点二,逆向比较大小,符合条件数值后移一位,k减一
          while (bucketLen >= 0 && bucket[bucketLen] > item) {
            bucket[bucketLen + 1] = bucket[bucketLen];
            bucketLen--;
          }
    
          //对应位置插入数组
          bucket[bucketLen + 1] = item;
        } else {
          //新增数值入桶(这裡不能引用变量bucket,详情http://www.qdfuns.com/notes/40831/dd2b82537d74065b8a53b75e2eb85715.html)
          buckets[index] = [item];
        }
      }
    
      //开始合并数组
      // 方法一,返回数字格式数组,但是步骤性能都较差
      /* var n = 0, result = [];
      while(n < bucketCount) {
          //中间可能有没有符合范围的断层数组
          if(buckets[n]) result = result.concat(buckets[n]);
          n++;
      }
      return result */
    
      //方法二,返回字符串格式数组,简单方便(平均时间快几毫秒级别)
      return buckets.join(',').split(',');
    }
    
    useTime("桶排序算法", bucketSort);
    
    //是否数组
    function isArray(obj) {
      var bol = Object.prototype.toString.call(obj) === "[object Array]";
      !bol && alert("当前入参非数组类型!");
      return bol;
    }
    
    //计时小玩意
    function useTime(name, fn) {
      var ary = [
        616,
        380,
        751,
        317,
        561,
        722,
        246,
        907,
        970,
        614,
        446,
        917,
        403,
        663,
        312
      ];
      console.time(name + "耗时");
      console.log("排序前: ", ary);
      console.log("排序后: ", fn(ary));
      console.timeEnd(name + "耗时");
    }
    

      

      

  • 相关阅读:
    MVC小系列(十五)【MVC+ZTree实现对树的CURD及拖拽操作】
    WCF身份验证之用户名密码认证
    sql 优化建议
    Redis key 设计技巧
    Redis配置文件详解
    Nlog配置文件
    Windown安装Mysql安装图解
    CentOS 7 命令备忘录
    WPF自定义ListBox样式
    WPF自定义圆形按钮样式资源文件
  • 原文地址:https://www.cnblogs.com/huangqiming/p/10412723.html
Copyright © 2020-2023  润新知