好长时间没更新博客了。。自从学了js之后,效率一天不如一天,之前学css的时候废寝忘食,现在连保持注意力集中都变得困难起来了,主要原因是我本来对css兴趣更多一些,作为小白,我对花里胡哨的样式很感兴趣,但到了js,突然出现的大量的理论知识、算法和抽象概念让我感到无所适从。。。有点难受。
对我来说学习js确实有些困难,但目前来说js毕竟还是前端的基础,是找工作的刚需,于是我决定将上课听到的内容尽可能详细的记录在博客中,即便忘记也有迹可循,给自己加个油,我对前端很感兴趣,我也希望能够学以致用,成功的转行。
排序算法
通过学习了解到,各式各样的复杂算法本质都是通过大量的简单逻辑组合而成,所以越是基础的东西越要记得牢靠才行。。。
列举了几种算法:
1. 选择排序
原理:声明一个用于获取数组中最小值索引的函数minIndex和用于交换数组中两个数字位置的函数swap来达到第i次获取最小值索引后与第i项换位的效果从而实现排序。
let swap = (array, i , j) =>{
let k = array[i]
array[i] = array[j]
array[j] = k
}
let minIndex = numbers =>{
let index = 0
for(let i = 1;i < numbers.length; i++){
if(numbers[i] < numbers[index]){
index = i
}
}
return index
}
let sort = numbers =>{
for(let i = 0 ; i < numbers.length-1; i++){
let index = minIndex(numbers)
swap(number,index,i)
}
}
2. 快速排序
原理:通过声明一个基准,将比基准大或小的项分别push到左右两边,最后合并左右两段的内容达到排序的目的
let quickSort = arr =>{
if(arr.length <= 1){
return arr
}
let pivotIndex = Math.floor(arr.length / 2)
let pivot = arr.splice(pivotIndex,1)[0]
let left = []
let right = []
for (let i = 0 ; i <arr.length ; i++){
if(arr[i] <pivot){
left.push(arr[i])
}else{
right.push(arr[i])
}
}
return quickSort(left).concat( [pivot],quickSort(right) )
}
3. 归并排序
原理:将待排序数组分成两部分,进行内部比较,若内部没有排好,就再次拆分直至得到排好的数组,最后将所有排好的数组顺次合并
let mergeSort = arr =>{
let k = arr.length
if(k===1){return arr}
let left = arr.slice(0, Math.floor(k/2))
let right = arr.slice(Math.floor(k/2))
return merge(mergeSort(left), mergeSort(right))
}
let merge = (a, b)=>{
if(a.length === 0) return b
if(b.length === 0) return a
return a[0] > b[0] ?
[b[0]].concat(merge(a, b.slice(1))) :
[a[0]].cocat(merge(a,slice(1)),b))
}
归并排序涉及到递归。。而我还不太动递归所以不是很好理解原理,等学习深入一些后再回来修改吧= =