算法与数据结构:排序算法(上)

124 阅读1分钟

找出最小的数

两个数找出较小的那个(minOf2的实现)

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]
undefined

再优化代码:这种写法叫做析构赋值

let minOf2 = ([a, b]) => 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 minOf3 = ([a,b,c]) => {
   return minOf2([minOf2([a,b]), c])
}

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

四个数中找出最小的那个(minOf4 的实现)

let minOf4 = ([a,b,c,d]) =>{
   return minOf2([a, minOf3([b,c,d])])
}
  • 任意长度数组求最小值,都可以通过minOf2来实现

找出最小的那个数

代码

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

思路

image.png

image.png

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

思路

  • 用递归实现

  • 用循环实现

  • 递归思路: 选择排序

长度为2的数组排序

代码

let sort2 = ([a,b]) =>{
    if (a < b) {
        return [a,b] //这里的[a,b] 不等于 上面的数组[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)
    // 从numbers 里删掉 min
    return [min].concat(sort2(numbers))
}

长度为4的数组排序

代码

let sort4 = (numbers) =>{
    let index = minIndex(numbers)
    let min = number[index]
    numbers.splice(index, 1)
    // 从numbers 里删掉 min
    return [min].concat(sort3(numbers))
}

任意长度的数组排序

let minIndex = (numbers) =>
    numbers.indexOf(min(numbers))
let min = (numbers) =>{
    if(numbers.length > 2) {
        return min(
            [numbers[0], min(numbers.slice(1))]
        )
    }else{
        return Math.min.apply(null, 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()
    }
}

image.png

例题:将[12,5,8,7,9]排序

let minIndex = (numbers) =>
    numbers.indexOf(min(numbers))
let min = (numbers) =>{
    if(numbers.length > 2) {
        return min(
            [numbers[0], min(numbers.slice(1))]
        )
    }else{
        return Math.min.apply(null, 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()
    }
}
sort([12,5,8,7,9) // [5,7,8,9,12]