排序算法(上)

170 阅读3分钟

求2个数中的最小值

必备知识

了解使用哪种数据结构,使用数组,表示[a,b]两个数字

结合编程知识

使用问号冒号表达式a>b? true : false简化代码

代码

实例1:使用if..else

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

实例2:继续简化,使用问号冒号表达式 这种写法也称为析构赋值

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

不同的调用方法

  • minOf2([1,2]) // 普通的调用法
  • minOf2.call(null,[1,2]) // 高级的调用法

JS的API

Math.min

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

关于Math

  • 通常来说,首字母大写就是构造函数,这是唯一的特例
  • Math只是普通对象,不是构造函数

求3个数中的最小值

使用minOf2方法可以得到任意长度数组的最小值

代码

实例1:

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

实例2: 使用minOf3在四个数中找到最小数

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

求N个数中的最小值

必备知识-递归

递归特点

  • 函数不停的调用自己,每次调用后参数略有不同
  • 当满足某个简单的条件后,实现一个简单的调用
  • 最终返回一个结果

理解递归

  • 使用代入法理解递归, 输入实际参数
  • 使用调用栈理解递归

代码

实例1:这个代码会死循环,需要一个终止循环的条件

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

实例2: 递归

let min = (numbers) =>{
    if(numbers.length > 2){
    return min([numbers[0], min(numbers.slice(1))
    )
  }else{
      retutn Math.min.apply(null, numbers)
  }
}

2个数的排序

必备思路: 使用递归 + 循环来实现

代码

实例1:

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

实例2:优化代码

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

实例3:寻找最小值的索引

let minIndex = (numbers) => numbers.indexOf(min(numbers))

3个数的排序

代码

实例1:问题在于无法将最小的值从数组中删除,sort2支持两个数的排序

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

实例2:

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

4个数的排序

实例:

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

N个数的排序

实例1:死循环

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

实例2:使用代入法,代入[12,5,8,7,9]查看过程

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()
 }
}

完整代码:

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


let minIndex = (numbers) => {
  return numbers.indexOf(min(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()
  }
}

console.log(sort([7,5,4,6,8,9,3,2,1]))

console.log调试

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