c++ 二维数组 排序_【算法与数据结构】排序算法(上)

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

  • 必备知识
  • 用数组[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 =([1,2]) => a<b ? a : b
  • 这种写法叫做析构赋值,之后课程会反复使用
  • 调用
  • minof2([1,2]) //1 这是小白调用法
  • minof2.call (null,[1,2]) // 这个是高手调用法

现成API

  • JS 内置了 Math.min
  • Math.min(1,2) //1
  • Math.min.call(null,1,2)
  • Math.min.apply(null,[1,2])
  • 关于Math
  • 看起来 Math 像 Object 一样是构造函数
  • 实际上 Math 只是一个普通对象
  • 这是唯一的特例: 首字母大写是构造函数

三个数找出最小的那个

  • 代码
  • let min0f3 =([a,b,c})=> {
    return minof2 ([minof2([a,b],c))
    }
    或者
    let minof3 = ([a,b,c]) => {
    return minof2([a,minof2([b,c])])
    }
  • 推理
  • 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)
}
}
这就是递归

be53f25cdcd3a855f73464b04ac68401.png

递归

  • 特点
  • 函数不停调用自己,每次调用的参数略有不同
  • 当满足某个简单条件是,则实现一个简单的调用
  • 最终随处结果
  • 理解
  • 可以用带入法快速理解递归
  • 可以用调用栈快速理解递归

排序算法

  • 思路
  • 用递归现实
  • 用循环实现

递归思路---选择排序

长度为2的数组排序

  • 代码
  • let sort2 =([a,b]) => {
    if(a < b) {
    return [a,b]
    }else{
    return [b,a]
    }
    }
  • 上面的[a,b]和[a,b] 是同一个数组吗? 答:是不同的数组
  • 优化代码
  • let sort 2 = ([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([a,b,c])
  • let min = numbers [index]
  • numbers.splice(index,1)
  • // 从 numbers 里删掉 min
  • return [min].concat(sort2(numbers))
    }

长度为4的数组排序

  • 代码
  • let sort4 =(numbers) => {
    let index = minIndex(numbers)
    let min =numbers[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))
    }
    死循环......

需要在2的时候断掉

  • 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.reverse()
    }
    }
    用代入法 sort([12,5,8,7,9])

5a175868fd259dbf8edd6e2301927985.png

console.log 调试

c1deeac3ba71cef60156a4ceb58537b4.png
console.log(`min:${min}`)

总结:

  • 求最小值
  • 2个数
  • 3个数
  • N个数
  • 排序
  • 2个数
  • 3个数
  • N个数
  • 用到的东西
  • 数组(数据结构)
  • 递归
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值