zoukankan      html  css  js  c++  java
  • 基础算法解析

    1. 五大算法
    • 贪心算法: 局部最优解法
    • 分治算法: 分成多个小模块,与原问题性质相同
    • 动态规划: 每个状态都是过去历史的一个总结
    • 回溯法: 发现原先选择不优时,退回重新选择
    • 分支限界法
    2. 基础排序算法
    • 口诀: 插冒归基稳定,快选堆希不稳定
     
    1、冒泡排序:两两比较
    function bubleSort(arr) {
            var len = arr.length;
            for (let i=0 ; i<len-1; i++) {
                for(let j = 0; j <=len- i - 1; j++) {
                    if(arr[j] > arr[j + 1]) {
                        [arr[j],arr[j+1]] = [arr[j+1],arr[j]]
                    }
                }
            }
            return arr;
        }
    2、选择排序: 遍历自身以后的元素,最小的元素跟自己调换位置
    function selectSort(arr) {
        var len = arr.length;
        for(let i = 0 ;i < len - 1; i++) {
            for(let j = i ; j<len; j++) {
                if(arr[j] < arr[i]) {
                    [arr[i],arr[j]] = [arr[j],arr[i]];
                }
            }
        }
        return arr
    }
     
    3、插入排序: 将元素插入到已排序好的数组中
    function insertSort(arr) {
        for(let i = 1; i < arr.length; i++) {  //外循环从1开始,默认arr[0]是有序段
            for(let j = i; j > 0; j--) {  //j = i,将arr[j]依次插入有序段中
                if(arr[j] < arr[j-1]) {
                    [arr[j],arr[j-1]] = [arr[j-1],arr[j]];
                } else {
                    break;
                }
            }
        }
        return arr;
    }

    4、快速排序(高级)
    • 选择基准值(base),原数组长度减一(基准值),使用 splice,也可选择中间值方便理解
    • 循环原数组,小的放左边(left数组),大的放右边(right数组);
    • concat(left, base, right)
    • 递归继续排序 left 与 right
      function quickSort(arr) {
          if(arr.length <= 1) {
              return arr;  //递归出口
          }
          var left = [],
              right = [],
              current = arr.splice(0,1); 
          for(let i = 0; i < arr.length; i++) {
              if(arr[i] < current) {
                  left.push(arr[i])  //放在左边
              } else {
                  right.push(arr[i]) //放在右边
              }
          }
          return quickSort(left).concat(current,quickSort(right));
      }
    一行代码实现快排(filter):
    function quickSort(a) {
      return a.length <= 1 ? a : quickSort(a.slice(1).filter(item => item <= a[0])).concat(a[0], quickSort(a.slice(1).filter(item => item > a[0])));
    }
    //slice是返回start-end选定的子数组,不修改原数组
    5、希尔排序(高级):不定步数的插入排序
    function shellSort(arr) {
      for(let gap = Math.floor(arr.length/2); gap > 0; gap = Math.floor(gap/2)) {
        // 内层循环与插入排序的写法基本一致,只是每次移动的步长变为 gap,而不是 1:
        for(let i = gap; i < arr.length; i++) {
          let j = i;
          let temp = arr[j];
          for(; j> 0; j -= gap) {
            if(temp >= arr[j-gap]) {
              break;
            }
            arr[j] = arr[j-gap];
          }
          arr[j] = temp;
        }
      }
      return arr;
    }
     
  • 相关阅读:
    redis 中 发布订阅 的 数据类型
    excelExport.js 导出 excel 表格
    Go 出现:err is shadowed during return(err在返回过程中被隐藏)
    Go 服务端 向 firebase Android 端 fcm 信息
    Python全栈day 03
    Python全栈day 01
    开发流程与版本管理规范
    php 魔术常量
    sql 消除重复
    重置mysql密码
  • 原文地址:https://www.cnblogs.com/Joe-and-Joan/p/10677751.html
Copyright © 2011-2022 走看看