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

274 阅读1分钟

正整数从小到大排序

先从两个数开始

  • 首先还是用数组来装这两个数
  • 比较第一个数和第二个数的大小,来改变两个数在数组里面的排序

let sort2 = (numbers) => { if(numbers[0] < numbers[1]) { return numbers }else { return numbers.reverse() } } //结构赋值 let sort2 = ([a,b]) => a < b ? [a,b] :[b,a] console.log(sort2.call(null,[2,1])) console.log(sort2.apply(null,[[2,1]]))


### 接下来,三个数从小到大排序
1. 首先求出三个数里面最小的数,将其排在第一位
2. 然后比较剩下的两个数的大小,根据大小改变两个数的排序
3. 再将第一个数和剩下两个数拼接成新的数组  
//求最小值的函数
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 sort2 = ([a,b]) => a < b ? [a,b] : [b,a]
//三个数排序
let sort3 = (numbers) => {
    let index = minIndex(numbers)
    let min = numbers[index]
    numbers.splice(index,1)
    return [min].concat(sort2(numbers))
}
console.log(sort3.call(null,[2,1,3]))
。。。。同理四个数也可以按照三个数的方法

### 推广到N个数从小到大排序
1. 首先,找出数组中最小的值,在与剩下的数组拼接成数组
2. 再从剩下的数组中,找出最小值,做上面相同的操作
3. 最后拼接成的数组就是最终的从小到大排序的数组  
//求最小值的函数
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.call(null,[2,3,1,7,6]))
## 每个递归都可以用循环表示
上述代码中,求最小值得数组下标可以改写成更简单的方式
let minIndex = (numbers) => {
let index = 0;
for (let i = 1; i < numbers.length; i++) {
    if (numbers[i] < numbers[index]) {
        index = i;
    }
}
return index;};