基础算法解析
Posted joe-and-joan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础算法解析相关的知识,希望对你有一定的参考价值。
1. 五大算法
- 贪心算法: 局部最优解法
- 分治算法: 分成多个小模块,与原问题性质相同
- 动态规划: 每个状态都是过去历史的一个总结
- 回溯法: 发现原先选择不优时,退回重新选择
- 分支限界法
2. 基础排序算法
- 口诀: 插冒归基稳定,快选堆希不稳定
1、冒泡排序:两两比较
function bubleSort(arr) { var len = arr.length; for (let i=0 ; i<len-1; i++) { for(let j = 0; j <=len- i - 1; j++) { if(arr[j] > arr[j + 1]) { [arr[j],arr[j+1]] = [arr[j+1],arr[j]] } } } return arr; }
2、选择排序: 遍历自身以后的元素,最小的元素跟自己调换位置
function selectSort(arr) { var len = arr.length; for(let i = 0 ;i < len - 1; i++) { for(let j = i ; j<len; j++) { if(arr[j] < arr[i]) { [arr[i],arr[j]] = [arr[j],arr[i]]; } } } return arr }
3、插入排序: 将元素插入到已排序好的数组中
function insertSort(arr) { for(let i = 1; i < arr.length; i++) { //外循环从1开始,默认arr[0]是有序段 for(let j = i; j > 0; j--) { //j = i,将arr[j]依次插入有序段中 if(arr[j] < arr[j-1]) { [arr[j],arr[j-1]] = [arr[j-1],arr[j]]; } else { break; } } } return arr; }
4、快速排序(高级)
- 选择基准值(base),原数组长度减一(基准值),使用 splice,也可选择中间值方便理解
- 循环原数组,小的放左边(left数组),大的放右边(right数组);
- concat(left, base, right)
- 递归继续排序 left 与 right
function quickSort(arr) { if(arr.length <= 1) { return arr; //递归出口 } var left = [], right = [], current = arr.splice(0,1); for(let i = 0; i < arr.length; i++) { if(arr[i] < current) { left.push(arr[i]) //放在左边 } else { right.push(arr[i]) //放在右边 } } return quickSort(left).concat(current,quickSort(right)); }
一行代码实现快排(filter):
function quickSort(a) { return a.length <= 1 ? a : quickSort(a.slice(1).filter(item => item <= a[0])).concat(a[0], quickSort(a.slice(1).filter(item => item > a[0]))); } //slice是返回start-end选定的子数组,不修改原数组
5、希尔排序(高级):不定步数的插入排序
function shellSort(arr) { for(let gap = Math.floor(arr.length/2); gap > 0; gap = Math.floor(gap/2)) { // 内层循环与插入排序的写法基本一致,只是每次移动的步长变为 gap,而不是 1: for(let i = gap; i < arr.length; i++) { let j = i; let temp = arr[j]; for(; j> 0; j -= gap) { if(temp >= arr[j-gap]) { break; } arr[j] = arr[j-gap]; } arr[j] = temp; } } return arr; }
以上是关于基础算法解析的主要内容,如果未能解决你的问题,请参考以下文章