《算法图解》
用js来练习书中例子
二分法
查找目标数值在数组中的index值。
原理:每次猜中间值,得出过大还是过小,最多只需log2(n)步,比如100个为7步,1000个为14步。
列表必须为有序,就是数组为从小到大排列。
JS算法
接受数组list
和目标值item
,
返回item
的index
值(目标位置)
思路: 定义 low mid high3个变量(为index数),list[mid]
对比item
,
mid值等于low+high/2, (取整即可。cell,floor,round都可以,有细微差别,可忽略)。
– 如果猜的值大于目标值->往小猜->目标mid值左边中点->最高值=中点-1
– 如果猜的值小于目标值->往大猜->目标mid值右边中点->最低值=中点+1
function index_search (list, item){
var low = 0;
var high= list.length-1;
while (low <= high){
var mid = Math.floor((low + high)/2);
list[mid]
if (list[mid] == item){
return mid;
} else if (list[mid] > item){
high = mid - 1;
}
else{
low = mid +1;
}
}
return "none";
}
console.log(index_search([1,2,5,7,8,9,11],18)); //none
去重
从0开始,左到右,通过逐一对比右边有没有重复,没有就push保存,有就i+进入下一个循环
function unique(array){
var temp =[];
var index =[]; //保存index值,可选
for (var i = 0; i < array.length; i++){
//往右边逐一对比,有相同就跳入下一i循环,直至这个i没有相同
for (var j = i + 1; j < array.length; j++){
if (array[i] == array[j]){
i++; //进入下一个i循环
j = i;
}
}
//到这说明此数右边已经没有相同
temp.push(array[i]);
index.push(i);
}
//同时返回index的值
console.log(index);
return temp;
}
var aa = [1,2,2,3,4,5,2,3,6,5];
console.log(unique(aa))
排列
找最小值
根据左边逐一对比右边是不是最小
function findsmall(array){
var min = array[0];
var index = 0;
for (var i=1;i<array.length; i++) {
if (array[i] < min){
min = array[i];
index = i;
}
}
console.log(index);
return min;
}
快速排序
D&C算法 divide and conquer 分而治之,递归式问题解决方法。
每次递归用都必须缩小问题的规模
快速排序
根据基准数值,将剩余数值分为左右两边,使用遍历,不断切分,直至分成1个。
var quickSort = function(arr) {
if (arr.length < 2) {
return arr;
}
var pivotIndex = Math.floor(arr.length / 2);
//选中基准线数值,并与原数组分离
var pivot = arr.splice(pivotIndex, 1)[0];
var left = [];
var right = [];
for (var 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));
};
var aa = [85,24,63,45,17,31,96,50]
console.log(quickSort(aa))