二分法,选择排序,快速排序实现
let arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17];
let arr2 = [1, 3, 5, 46, 548, 4561, 25, 3467, 2345, 546, 5, 7, 568, 7988, 90, 0, 9, 098, 0]
let arr3 = [1, 3, 5, 46, 548, 4561, 25, 3467, 2345, 546, 5, 7, 568, 7988, 90, 0, 9, 098, 0]
function search(arr, target) {//二分法
count++
let start = arr.length%2 === 0 ? arr.length/2 : (arr.length-1)/2;
let highArr = arr.slice(start);
let lowArr = arr.slice(0, start);
let tmpArr;
let value;
if(target > arr[start]) {
tmpArr = highArr;
value = search(tmpArr, target)
}else if(target < arr[start]) {
tmpArr = lowArr;
value = search(tmpArr, target)
}else {
value = [arr[start]];
}
return value;
}
console.log(search(arr1, 16))
let count = 0;
function sort(arr) {//快速排序
count++;
let less = [];
let greater = [];
let base = arr[0];
if(arr.length < 2) {
return arr
}else {
for(let i = 1; i < arr.length; i++) {
if(arr[i] < base) {
less.push(arr[i])
}else {
greater.push(arr[i])
}
}
return [...sort(less), base, ...sort(greater)]
}
}
console.log(sort(arr2))
function selectionSort(arr) {//选择排序
var len = arr.length;
var minIndex, temp;
for (var i = 0; i < len - 1; i++) {
minIndex = i;
for (var j = i + 1; j < len; j++) {
if (arr[j] < arr[minIndex]) { // 寻找最小的数
minIndex = j; // 将最小数的索引保存
}
}
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
return arr;
}
广度优先搜索
广度优先搜索解决2个问题:
- 从A到B的是否存在一个路径
- 从A到B最短的路径是多少
图:
- 图是有节点和边组成。
- 拓扑是一种特殊的图。
- 单向的图被称为树。
数据结构
- 队列是先进先出的。
- 栈是先进后出的。
贪婪算法
局部最优推出全局最优的近似解
动态规划
- 动态规划适合在给定约束条件下优化某种指标。
- 问题可分散为离散问题时,可使用动态规划解决
- 每种动态规划都涉及网格
- 没有放之四海而皆准的动态规划方案
K最邻近算法(KNN)
- KNN用于分类和回归,需要考虑最近的邻居
- 分类就是编组
- 回归就是预测结果
- 特征抽取就是将目标对象转化为可比较的数字
- 挑选合适的特征事关KNN算法的成败