《算法圖解》
用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))