基礎算法(二分,去重,排列)

《算法圖解》

用js來練習書中例子

二分法

查找目標數值在數組中的index值。
原理:每次猜中間值,得出過大還是過小,最多隻需log2(n)步,比如100個爲7步,1000個爲14步。
列表必須爲有序,就是數組爲從小到大排列。

JS算法
接受數組list和目標值item
返回itemindex值(目標位置)
思路: 定義 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))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章