排序算法(上)

351 阅读1分钟
  • 我们先从两个数中找到较小的

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

我们可以直接用表达式来判定两个数那个大,那个小来选择我们所需要的。

其实JS为我们配置了现成的API:
Math.min(1,2)//可以筛选出1和2的较小值
Math.min.call(null,1,2)//引为这里不要用到this,所以第一个数为null
Math.min.apply(null,[1,2])//apply可以接受数组
Math为唯一的首字母大写的对象

那三个数呢?

  • 三个数中找出最小的那个

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

三个数的比较就是利用两次两个数的比较而已,我们由此推广到任意长度数组求出最小值:

  • 任意长度数组求最小值

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

还可以用另外一种方法:直接用**arr.sort()**来吧数组直接从小到大排序

let min =(numbers)=>{
let arr=numbers.sort()
return arr[0]
}

不用**arr.sort()**我们如何将数组从小到大排序呢?

  • 首先我们先把长度为2 的数组排序:

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

那长度为3呢?那也简单:

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

我们这个时候发现我们需要再后面的数组里剔除已经被比下去的数据

这个时候我们就需要知道被剔除 的数据的下标minIndex,由此:

let minIndex=(numbers)=>{
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]>number[1]? numbers :numbers.reverse() } }

当然用arr.sort()更快:

let sort =(numbers)=>{
let arr=numbers.sort()
return arr
}

前端小白,请留言指正!!!