最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解js中常用4個(gè)基礎(chǔ)算法

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

冒泡排序

原理

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

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

它排序需要兩次循環(huán)來(lái)設(shè)計(jì):
第一層循環(huán)控制排序arr.length - 1
第二層循環(huán)負(fù)責(zé)每次交換遍歷數(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;
};

實(shí)現(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]

選擇排序

原理

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

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

它與冒泡排序不同的是它不會(huì)頻繁的發(fā)生交換,第一層循環(huán)結(jié)束后,看條件是否滿足需要交換。
它排序需要兩次循環(huán)來(lái)設(shè)計(jì):
第一層循環(huán)控制排序arr.length - 1
第二層循環(huán)負(fù)責(zé)找出交換下標(biāo)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++) {
      // 找出下標(biāo)
      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)容來(lái)自參考文章:@插入排序通過(guò)構(gòu)建有序序列,對(duì)于未排序數(shù)據(jù),在已排序序列中從后向前掃描,找到相應(yīng)位置并插入。
一般來(lái)說(shuō),插入排序都采用 in-place 在數(shù)組上實(shí)現(xiàn):

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

動(dòng)圖展示

代碼

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]

快速排序

原理

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

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

代碼

const quickSort = arr => {
  const len = arr.length;
  if (len <= 1) return arr;
  // 基準(zhǔn)
  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個(gè)基礎(chǔ)算法的詳細(xì)內(nèi)容,更多關(guān)于js基礎(chǔ)算法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JavaScript中處理數(shù)組,對(duì)象和正則的實(shí)用函數(shù)

    JavaScript中處理數(shù)組,對(duì)象和正則的實(shí)用函數(shù)

    本文主要分享一下最近項(xiàng)目中遇到的一些javascript的業(yè)務(wù)邏輯函數(shù),這些函數(shù)可以提成一個(gè)公用的工具函數(shù)以便于在以后的項(xiàng)目中進(jìn)行使用,希望對(duì)大家有所幫助
    2023-11-11
  • 全系IE支持Bootstrap的解決方法

    全系IE支持Bootstrap的解決方法

    用了bootstrap模版搭建的網(wǎng)站,在IE7中打不開(kāi),在IE8中背景圖片都不顯示,內(nèi)容排列也出現(xiàn)問(wèn)題,在IE9中表現(xiàn)的最好,在IE11中出現(xiàn)彈出層中的圖片無(wú)法顯示,那么這些兼容性怎么去解決
    2015-10-10
  • ES6代碼轉(zhuǎn)ES5詳細(xì)教程(babel安裝使用教程)

    ES6代碼轉(zhuǎn)ES5詳細(xì)教程(babel安裝使用教程)

    Babel 是一個(gè)廣泛使用的 ES6 轉(zhuǎn)碼器,可以將 ES6 代碼轉(zhuǎn)為 ES5 代碼,從而在老版本的瀏覽器執(zhí)行,這意味著,你可以用 ES6 的方式編寫(xiě)程序,又不用擔(dān)心現(xiàn)有環(huán)境是否支持,這篇文章主要介紹了ES6代碼轉(zhuǎn)ES5教程(babel安裝使用教程),需要的朋友可以參考下
    2023-01-01
  • javascript Excel操作知識(shí)點(diǎn)

    javascript Excel操作知識(shí)點(diǎn)

    使用JavaScript中的ActiveXObject填充并設(shè)置Excel格式
    2009-04-04
  • javascript 簡(jiǎn)練的幾個(gè)函數(shù)

    javascript 簡(jiǎn)練的幾個(gè)函數(shù)

    看CSDN上別人的代碼,感覺(jué)比較精煉,拿來(lái)主義,需要的朋友可以看下。
    2009-08-08
  • echarts浮動(dòng)顯示單位的實(shí)現(xiàn)方法示例

    echarts浮動(dòng)顯示單位的實(shí)現(xiàn)方法示例

    這篇文章主要給大家介紹了關(guān)于echarts浮動(dòng)顯示單位的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • JavaScript算法學(xué)習(xí)之冒泡排序和選擇排序

    JavaScript算法學(xué)習(xí)之冒泡排序和選擇排序

    這篇文章主要給大家介紹了關(guān)于JavaScript算法學(xué)習(xí)之冒泡排序和選擇排序的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用JavaScript具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 瀏覽器兼容性問(wèn)題大匯總

    瀏覽器兼容性問(wèn)題大匯總

    本文給大家介紹了42種瀏覽器兼容性問(wèn)題大匯總的相關(guān)知識(shí),本文介紹的非常詳細(xì),感興趣的朋友一起學(xué)習(xí)吧
    2015-12-12
  • 使用js如何實(shí)現(xiàn)全選與全不選

    使用js如何實(shí)現(xiàn)全選與全不選

    全選與全不選在管理界面還是比較實(shí)用的,下面通過(guò)checkAll與clearAll兩個(gè)函數(shù)來(lái)輕松實(shí)現(xiàn),感興趣的朋友不要錯(cuò)過(guò)
    2013-12-12
  • JS實(shí)現(xiàn)小米輪播圖

    JS實(shí)現(xiàn)小米輪播圖

    這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)小米輪播圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09

最新評(píng)論

新营市| 松桃| 永康市| 鄯善县| 九寨沟县| 宜昌市| 牟定县| 南开区| 全州县| 遵义市| 禹城市| 马龙县| 西充县| 乌什县| 河西区| 德江县| 巨野县| 顺昌县| 股票| 大冶市| 庄河市| 安化县| 呼玛县| 晋城| 慈利县| 呼和浩特市| 平潭县| 亳州市| 垣曲县| 汾阳市| 东方市| 永福县| 忻州市| 博兴县| 崇州市| 鹤岗市| 沐川县| 青铜峡市| 婺源县| 神农架林区| 石泉县|