26·灵魂前端工程师养成-排序算法

2019-05-13 分类:JavaScript, 前端开发 阅读(23) 评论(0)

-曾老湿, 江湖人称曾老大。
-笔者QQ:133411023、253097001
-笔者交流群:198571640
-笔者微信:z133411023


-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。
-擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。
-devops项目经理兼DBA。
-开发过一套自动化运维平台(功能如下):

1)整合了各个公有云API,自主创建云主机。
2)ELK自动化收集日志功能。
3)Saltstack自动化运维统一配置管理工具。
4)Git、Jenkins自动化代码上线及自动化测试平台。
5)堡垒机,连接Linux、Windows平台及日志审计。
6)SQL执行及审批流程。
7)慢查询日志分析web界面。


算法入门


如何找到两个数中较小的那个数

首先,我们的想法应该是如何表示两个数字?

如果你能想到,使用[a,b]数组,来表示,就说明你在使用数据结构

使用判断,或者问号,冒号表达式

代码如下

let minOf2 = (numbers) => {
  if(numbers[0] < numbers[1]){
    return numbers[0]
  }else{
    return numbers[1]
  }
}

优化代码

let minOf2 = numbers => numbers[0] < numbers[1] ? numbers[0] : numbers[1]

再优化代码

let minOf2 = ([a,b]) => a<b ? a : b

调用

//小白调用
minOf2([1,2])

//高手调用
minOf2(null,[1,2])

当然了,JS已经提供了现成的方法Math.min

Math.min(1,2)
Math.min.call(null,1,2)
Math.min.apply(null,[1,2])


举一反三,三个数字呢

求三个数字中间最小的。

let minOf3 = ([a,b,c]) => {
  return minOf2(minOf2[(a,b)],c)
}

let minOf3 = ([a,b,c]) => {
  return minOf2(a,minOf2([b,c]))
}

推理,如果是4个数字呢?

let minOf4 = ([a,b,c,d]) => {
  return minOf2([a,minOf3(b,c,d)])
}

任意长度数组求最小值,都可以通过minOf2实现。


推广:任意长度的数组

代码如下

let min = (numbers) => {
  return min(
    [numbers[0],min(numbers.slice(1))]
  )
}

//这个代码会死循环,不停的调用自己,需要添加一个终止条件

其他方法

let min = (numbers) => {
  if(numbers.length > 2){
    return min(
      [numbers[0],min(numbers.slice(1))]
    )
  }else{
    return Math.min.apply(null,numbers)
  }
}
//这就是递归

递归的特点:
1.函数不停的调用自己,每次调用的参数略有不同
2.当满足某个简单条件时,则实现一个简单的调用
3.最终算出结果


将正整数数组从小到大排序

排序算法:
1.递归
2.循环

递归思路,选择排序:

长度为2的数组排序

let sort2 = ([a,b]) => {
  if(a<b){
    return [a,b]
  }else{
    return [b,a]
  }
}

优化代码

let sort2 = ([a,b]) => a<b ? [a,b] : [b,a]

长度为3的数组排序

let sort3 ([a,b,c])  => {
  return [min([a,b,c]),sort2([???])]
}

//我们发现无法将最小值,从数组里面删掉

改进代码

let sort3 = (numbers) => {
  let index = minIndex(numbers)
  let min = numbers[index]
  numbers.splice(index,1)
  return [min].concat(sort2(numbers))
}

//定义minIndex
let minIndex = (numbers) =>
  numbers.indexOf(min(numbers))

长度为4

let sort4 = (numbers) =>{
  let index = minIndex(numbers)
  let min = numbers[index]
  numbers.splice(index,1)
  return [min].concat(sort3(numbers))
}

任意长度排序
let sort = (numbers) => {
  let index = minIndex(numbers)
  let min = numbers[index]
  numbers.splice(index,1)
  return [min].concat(sort(numbers))
}
//和之前一样,这个代码会死循环

优化代码:

let sort = (numbers) => {
  if(numbers.length > 2){
    let index = minIndex(numbers)
    let min = numbers[index]
    numbers.splice(index,1)
    return [min].concat(sort(numbers))
  }else{
    return numbers[0]<numbers[1] ? numbers : numbers.reverse()
  }
}

关于 曾老湿
我只是一个躲在角落里瑟瑟发抖的小运维,随时准备给大佬端茶递水。
WeChat:z133411023
QQ:133411023
欢迎新朋友你的到来!
还没有人抢沙发呢~
昵称
邮箱
网站
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

切换登录

注册