欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解js中常用4個基礎算法

 更新時間:2023年05月25日 12:09:51   作者:逆風起飛  
本文主要介紹了JS中常用的四個基礎算法,主要介紹了冒泡排序,選擇排序,插入排序和快速排序這四種算法,需要的朋友可以參考下

冒泡排序

原理

相鄰兩個數(shù)據(jù)的按條件交換排序,然后遍歷式的交換排序。
何為冒泡?每次遍歷為一次 冒泡,一次遍歷完成,冒泡結(jié)束至少會讓一個元素移動到正確的位置。
列:

const arr = [3, 2, 1];
// 第1次冒泡后[2, 1,3] 3移動到正確位置
// 第2次冒泡后[1,2,3] 2移動到正確位置

它排序需要兩次循環(huán)來設計:
第一層循環(huán)控制排序arr.length - 1
第二層循環(huán)負責每次交換遍歷數(shù)據(jù)的相鄰數(shù)據(jù)交換, 共arr.length - 1 - i次,i第一層循環(huán) 已循環(huán)次數(shù)。

代碼

export const mySort = arr => {
  for (let i = 0; i < arr.length - 1; i++) {
    // 控制循環(huán)次數(shù)
    for (let j = 0; j < arr.length - i - 1; j++) {
      // 數(shù)據(jù)交換
      if (arr[j] > arr[j + 1]) {
        const temp = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = temp;
      }
    }
  }
  return arr;
};

實現(xiàn)array.sort:

export const mySort = (arr, fn) => {
  for (let i = 0; i < arr.length - 1; i++) {
    // 控制循環(huán)次數(shù)
    for (let j = 0; j < arr.length - i - 1; j++) {
      // 數(shù)據(jù)交換
      if (fn(arr[j], arr[j + 1])) {
        const temp = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = temp;
      }
    }
  }
  return arr;
};
mySort([1, 5, 3, 8, 2, 4], (a, b) => a > b); // ?[1, 2, 3, 4, 5, 8]
mySort([1, 5, 3, 8, 2, 4], (a, b) => a < b); // [8, 5, 4, 3, 2, 1]

選擇排序

原理

對數(shù)組遍歷后選取符合條件(最大或最?。┑臄?shù),與數(shù)組對應位置的數(shù)進行交換。
何為選擇?每次遍歷為一次 選擇,一次遍歷完成結(jié)束會得出一個符合條件的元素并交換位置。
列:

const arr = [3, 2, 1];
// 第1次選擇后[1, 2,3] 1與3交換位置
// 第2次選擇后[1, 2,3] 

它與冒泡排序不同的是它不會頻繁的發(fā)生交換,第一層循環(huán)結(jié)束后,看條件是否滿足需要交換。
它排序需要兩次循環(huán)來設計:
第一層循環(huán)控制排序arr.length - 1
第二層循環(huán)負責找出交換下標indexj = ij前面已排好。

代碼

export const mySort = (arr, fn) => {
  for (let i = 0; i < arr.length - 1; i++) {
    // 控制循環(huán)次數(shù)
    let index = i;
    for (let j = i; j < arr.length; j++) {
      // 找出下標
      if (fn(arr[j], arr[index])) {
        index = j;
      }
    }
    // 交換數(shù)據(jù)
    if (index !== i) {
      const copy = arr[index];
      arr[index] = arr[i];
      arr[i] = copy;
    }
  }
  return arr;
};
mySort([9, 5, 3, 4], (a, b) => a > b); // [9, 5, 4, 3]

插入排序

原理

以下內(nèi)容來自參考文章:@插入排序通過構(gòu)建有序序列,對于未排序數(shù)據(jù),在已排序序列中從后向前掃描,找到相應位置并插入。
一般來說,插入排序都采用 in-place 在數(shù)組上實現(xiàn):

  • 從第一個元素開始,該元素可以認為已經(jīng)被排序;
  • 取出下一個元素,在已經(jīng)排序的元素序列中從后向前掃描;
  • 如果該元素(已排序)大于新元素,將該元素移到下一位置;
  • 重復步驟3,直到找到已排序的元素小于或者等于新元素的位置;
  • 將新元素插入到該位置后;
  • 重復步驟2~5。

動圖展示

代碼

const insertion = arr => {
  const len = arr.length;
  let preIndex;
  let current;
  for (let i = 1; i < len; i++) {
    preIndex = i - 1;
    current = arr[i];
    while (preIndex >= 0 && current < arr[preIndex]) {
      arr[preIndex + 1] = arr[preIndex];
      preIndex--;
    }
    arr[preIndex + 1] = current;
  }
  return arr;
};
insertion([3, 5, 7, 1, 4, 56, 12, 78, 25, 0, 9, 8, 42, 37]);
// ?[0, 1, 3, 4, 5, 7, 8, 9, 12, 25, 37, 42, 56, 78]

快速排序

原理

快速排序使用分治法策略來把一個數(shù)組分為兩個數(shù)組,再重復把這兩個數(shù)組變成四個,直至length <= 1。 思路:

  • 從數(shù)組中挑出一個元素,稱為 "基準"。
  • 重新排序數(shù)組,所有元素比基準值小的擺放在基準前面(left),所有元素比基準值大的擺在基準的后面(right),相同的數(shù)可以到任一邊。在這個分區(qū)退出之后,該基準就處于數(shù)列的中間位置。這個稱為分區(qū)操作。
  • 遞歸 地把小于基準值元素的數(shù)組和大于基準值元素的數(shù)組排序,重復1~2。

代碼

const quickSort = arr => {
  const len = arr.length;
  if (len <= 1) return arr;
  // 基準
  const num = arr[0];
  // 左右分區(qū)
  const left = [];
  const right = [];
  for (let index = 1; index < arr.length; index++) {
    arr[index] <= num ? left.push(arr[index]) : right.push(arr[index]);
  }
  // 遞歸
  return quickSort(left).concat([num], quickSort(right));
};
console.log(quickSort([3, 2, 6, 8, 99, 2, 3]));//?[2, 2, 3, 3, 6, 8, 99]

以上就是詳解js中常用4個基礎算法的詳細內(nèi)容,更多關(guān)于js基礎算法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JavaScript實現(xiàn)循環(huán)輪播圖

    JavaScript實現(xiàn)循環(huán)輪播圖

    這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)循環(huán)輪播圖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • js從外部獲取圖片的實現(xiàn)方法

    js從外部獲取圖片的實現(xiàn)方法

    下面小編就為大家?guī)硪黄猨s從外部獲取圖片的實現(xiàn)方法。小編覺得挺不錯的, 現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • JS sort排序詳細使用方法示例解析

    JS sort排序詳細使用方法示例解析

    這篇文章主要介紹了JS sort排序詳細使用方法示例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • ionic 自定義彈框效果

    ionic 自定義彈框效果

    這篇文章主要介紹了ionic 自定義彈框效果,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-06-06
  • Bootstrap table使用方法總結(jié)

    Bootstrap table使用方法總結(jié)

    這篇文章主要總結(jié)介紹了Bootstrap table的使用方法,服務器分頁、客戶端分頁的轉(zhuǎn)換,table刷新,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • javascript 得到文件后綴名的思路及實現(xiàn)

    javascript 得到文件后綴名的思路及實現(xiàn)

    在上傳文件時,常常要對文件的類型即對文件的后綴名進行判斷,用javascript可以很容易的做到這一點。用Javascript解析一個帶絕對路徑的文件名并得到后綴名的方法有很多種,這里列出一種,以供參考。
    2013-07-07
  • JavaScript實現(xiàn)時間格式的切割與轉(zhuǎn)換

    JavaScript實現(xiàn)時間格式的切割與轉(zhuǎn)換

    這篇文章主要為大家詳細介紹了使用JavaScript實現(xiàn)時間格式的切割與轉(zhuǎn)換的相關(guān)知識,文中的示例代碼講解詳細,有需要的小伙伴可以參考一下
    2024-04-04
  • 詳解CocosCreator游戲之魚群算法

    詳解CocosCreator游戲之魚群算法

    這篇文章主要介紹了詳解CocosCreator游戲之魚群算法,對算法感興趣的同學,可以仔細參考下
    2021-04-04
  • Chrome插件(擴展)開發(fā)全攻略(完整demo)

    Chrome插件(擴展)開發(fā)全攻略(完整demo)

    Chrome插件是一個用Web技術(shù)開發(fā)、用來增強瀏覽器功能的軟件,它其實就是一個由HTML、CSS、JS、圖片等資源組成的一個.crx后綴的壓縮包,本文給大家分享一個Chrome插件(擴展)開發(fā)全攻略完整demo,感興趣的朋友跟隨小編一起學習下吧
    2021-05-05
  • javascript 手動給表增加數(shù)據(jù)的小例子

    javascript 手動給表增加數(shù)據(jù)的小例子

    這篇文章介紹了js手動給表增加數(shù)據(jù)的實例代碼,有需要的朋友可以參考一下
    2013-07-07

最新評論