Js常用的算法教程 深度廣度及老、冒泡選擇抽莱、防抖、節(jié)流骄恶、二分查找

如果覺得還有點用食铐,請您給我一個贊!您的贊是我堅持下去的動力僧鲁!

深度遍歷

拿DOM作為遍歷對象虐呻,實現(xiàn)2種遍歷方法案例

/**
原理:節(jié)點的子節(jié)點先遍歷,再遍歷同級節(jié)點
node:一個節(jié)點
fn:每個節(jié)點需要執(zhí)行的操作
**/
async deep(node,fn){
  await fn(node);
  if(node.children){
    for(let i=0;i<node.children.length;i++){
      await this.deep(node.children[i],fn);
    }
  }
}
廣度遍歷
/**
原理:節(jié)點的同級節(jié)點先遍歷寞秃,再遍歷子節(jié)點
node:一個節(jié)點
fn:每個節(jié)點需要執(zhí)行的操作
**/
async wide(node,fn){
  let queue = [];
  queue.push(node);
  while (queue.length != 0) {
    let item = queue.shift();
    await fn(item);
    for (let j = 0; j < item.children.length; j++) {
      queue.push(item.children[j])
    }
  }
}
防抖
  • 原理:函數(shù)在調(diào)用倒計時n時間內(nèi)沒有重復(fù)調(diào)用斟叼,則執(zhí)行函數(shù),不然重新倒計時
  • 應(yīng)用場景:常用在鼠標(biāo)滾動等一些超高頻操作下需要執(zhí)行函數(shù)刷新時
function run(fn,ms){
  let tm=null;
  return function(){
    clearTimeout(tm);
    tm=setTimeout(()=>{
      fn.apply(this, arguments);
    },ms)
  }
}
節(jié)流
  • 原理:當(dāng)函數(shù)未執(zhí)行完前重復(fù)調(diào)用將無效
  • 應(yīng)用場景:常用在定時刷新
function run(fn,ms){
  let canrun=true;
  return function(){
    if(!canrun)return;
    canrun=false;
    tm=setTimeout(()=>{
      fn.apply(this, arguments);
      canrun=true;
    },ms)
  }
}
優(yōu)化版冒泡排序
/**
 特點:優(yōu)化后遍歷次數(shù)可以較小春寿,基本滿足前端常見排序要求了
 **/
function bubbleSort(arr) {
  let len = arr.length;
  let k = len - 1;
  let isSwap = false;//是否交換標(biāo)記
  let pos = 0;//最后一次交換位置
  let temp = null;
  for (let i = 0; i < len; i++) {
    isSwap = false;
    pos = 0;
    for (let j = 0; j < k; j++) {
      if (arr[j] > arr[j + 1]) {
        temp = arr[j + 1];
        arr[j + 1] = arr[j];
        arr[j] = temp;
        pos = j;
        isSwap = true;
      }
    }
    if (!isSwap) { return arr; }
    k = pos;
  }
  return arr;
}
選擇排序
/**
特點:最大數(shù)據(jù)交換次數(shù)是固定的數(shù)組長度相等朗涩,遍歷次數(shù)永遠(yuǎn)固定
 **/
function selectionSort(arr) {
  let len = arr.length;
  let minIndex, temp;
  for (let i = 0; i < len - 1; i++) {
    minIndex = i;
    for (let j = i + 1; j < len; j++) {
      if (arr[j] < arr[minIndex]) {   //尋找最小的數(shù)
        minIndex = j;         //將最小數(shù)的索引保存
      }
    }
    if(i!=minIndex){
      temp = arr[i];
      arr[i] = arr[minIndex];
      arr[minIndex] = temp;
    }
  }
  return arr;
}
快速排序
function quickSort(arr){  
  if (arr.length <= 1) {  
    return arr;  
  }  

  //取出數(shù)組中間的一位作為比較對象 如 [5,0,6,3,8] 則取出6,數(shù)組變?yōu)閇5,0,3,8]
  var povitIndex = arr.length>>>1;  
  var povit = arr.splice(povitIndex, 1)[0];  

  //接下來就是遍歷[5,0,3,8]將比6小的數(shù)放入到leftArr,相反放入rightArr
  var leftArr = [], rightArr = [];  
  for (var i = arr.length - 1; i >= 0; i--) {  
    if (arr[i] < povit) {  
        leftArr.push(arr[i]);  
    } else {  
        rightArr.push(arr[i]);  
    }  
  }  
  //遍歷下來后生成了 leftArr[5,0,3],rightArr[8]

  //接下來遞歸調(diào)用绑改,繼續(xù)將leftArr和rightArr這2個數(shù)組重復(fù)以上的操作
  //最終將leftArr+povit+rightArr 合并為一個數(shù)組即得最終排序后結(jié)果
  return quickSort(leftArr).concat([povit], quickSort(rightArr));  
}  

二分查找 - 適用于對排序后的數(shù)組,時間復(fù)雜度O(logn)

/**
* arr:[1,2,3,4]排序后的數(shù)組
* target:目標(biāo)尋找的值
* type:left|right|''  查詢方式谢床,left:查詢最左值兄一,right:查詢最右值
*/
function bsearch(arr, target, type){
    let begin = 0;
    let end = arr.length;
    let idx =-1;
    
    while(begin < end ) {
        let mid = (begin + end) >>> 1;
        if(arr[mid] == target) {
            if(type === 'right'){
                begin =  mid+1;
            }
            else if(type === 'left'){
                end =  mid;
            }else{
                return mid;
            }
            
        }
        else if(arr[mid] > target) {
            end = mid;
        }
        else if(arr[mid] < target) {
            begin = mid + 1; 
        }
    }
    
    if(type === 'right'){
        idx = arr[begin-1]===target?begin-1:-1;
    }
    else if(type === 'left'){
        idx =  arr[begin]===target?begin:-1;
    }
    console.log(`${idx}位`)
    return idx;
    
}
bsearch([1,4,5,7,11],5); //2
bsearch([1,3,3,3,5],3,'left');//1
bsearch([1,3,3,3,5],3,'right'); //3

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末识腿,一起剝皮案震驚了整個濱河市出革,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌渡讼,老刑警劉巖蹋盆,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異硝全,居然都是意外死亡栖雾,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門伟众,熙熙樓的掌柜王于貴愁眉苦臉地迎上來析藕,“玉大人,你說我怎么就攤上這事凳厢≌穗剩” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵先紫,是天一觀的道長治泥。 經(jīng)常有香客問我,道長遮精,這世上最難降的妖魔是什么居夹? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮本冲,結(jié)果婚禮上准脂,老公的妹妹穿的比我還像新娘。我一直安慰自己檬洞,他們只是感情好狸膏,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著添怔,像睡著了一般湾戳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上广料,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天砾脑,我揣著相機(jī)與錄音,去河邊找鬼性昭。 笑死拦止,一個胖子當(dāng)著我的面吹牛县遣,可吹牛的內(nèi)容都是我干的糜颠。 我是一名探鬼主播汹族,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼其兴!你這毒婦竟也來了顶瞒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤元旬,失蹤者是張志新(化名)和其女友劉穎榴徐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匀归,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡坑资,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了穆端。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袱贮。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖体啰,靈堂內(nèi)的尸體忽然破棺而出攒巍,到底是詐尸還是另有隱情,我是刑警寧澤荒勇,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布柒莉,位于F島的核電站,受9級特大地震影響沽翔,放射性物質(zhì)發(fā)生泄漏兢孝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一仅偎、第九天 我趴在偏房一處隱蔽的房頂上張望西潘。 院中可真熱鬧,春花似錦哨颂、人聲如沸喷市。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽品姓。三九已至,卻和暖如春箫措,著一層夾襖步出監(jiān)牢的瞬間腹备,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工斤蔓, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留植酥,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像友驮,于是被迫代替她去往敵國和親漂羊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345