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

前端必須掌握的五種常用排序算法總結(jié)大全

 更新時間:2024年10月24日 10:46:53   作者:子羽bro  
前端開發(fā)中掌握排序算法對于數(shù)據(jù)處理至關(guān)重要,本文介紹五種基本排序算法,冒泡排序、選擇排序、插入排序、快速排序和歸并排序,幫助開發(fā)者選擇合適的方法優(yōu)化性能,需要的朋友可以參考下

前言

在前端開發(fā)中,對數(shù)據(jù)進行排序是一項基本且常見的任務(wù)。掌握排序算法不僅可以幫助我們更有效地處理數(shù)據(jù),還能提升代碼的執(zhí)行效率。本文將介紹五種基礎(chǔ)且常用的排序算法:冒泡排序、選擇排序、插入排序、快速排序和歸并排序。通過理解這些算法的原理和邏輯,我們可以更好地選擇合適的排序方法來優(yōu)化應(yīng)用性能。

1. 冒泡排序(Bubble Sort)

冒泡排序是一種簡單的排序算法,它重復(fù)地遍歷待排序的數(shù)列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。遍歷數(shù)列的工作是重復(fù)地進行直到?jīng)]有再需要交換,也就是說該數(shù)列已經(jīng)排序完成。

原理和邏輯:

  • 比較相鄰的兩個元素,如果第一個比第二個大,就交換它們兩個;
  • 對每一對相鄰元素做同樣的工作,從開始第一對到結(jié)尾的最后一對。這步做完后,最后的元素會是最大的數(shù);
  • 針對所有的元素重復(fù)以上的步驟,除了最后一個;
  • 持續(xù)每次對越來越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對數(shù)字需要比較。

代碼實現(xiàn)

// 1. 冒泡排序
let arr = [2, 5, 8, 1, 3, 9, 6, 7];

const bubbleSort = (arr) => {
  let len = arr.length;
  for (let i = 0; i < len; i++) {
    for (let j = 0; j < len - i - 1; j++) {
      if (arr[j] > arr[j + 1]) {
        let tmp = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = tmp;
      }
    }
  }
  return arr;
};
console.log("bubbleSort:",bubbleSort(arr));
//bubbleSort: [1, 2, 3, 5, 6, 7, 8, 9]

2. 選擇排序(Selection Sort)

選擇排序是一種簡單直觀的排序算法。它的工作原理是首先在未排序序列中找到最?。ù螅┰?,存放到排序序列的起始位置,然后,再從剩余未排序元素中繼續(xù)尋找最?。ù螅┰?,然后放到已排序序列的末尾。

原理和邏輯:

  • 從未排序序列中找到最?。ù螅┰兀娣诺脚判蛐蛄械钠鹗嘉恢?;
  • 再從剩余未排序元素中繼續(xù)尋找最?。ù螅┰兀缓蠓诺揭雅判蛐蛄械哪┪?;
  • 重復(fù)第二步,直到所有元素均排序完畢。

代碼實現(xiàn)

// 2. 選擇排序
let arr = [2, 5, 8, 1, 3, 9, 6, 7];

const selectSort = (arr) => {
  let len = arr.length;
  for (let i = 0; i < len - 1; i++) {
    let maxIndex = i;
    for (let j = i + 1; j < len; j++) {
      if (arr[j] > arr[maxIndex]) {
        maxIndex = j;
      }
    }
    let tmp = arr[i];
    arr[i] = arr[maxIndex];
    arr[maxIndex] = tmp;
  }
  return arr;
};
console.log("selectSort:",selectSort(arr));
//selectSort: [1, 2, 3, 5, 6, 7, 8, 9]

3. 插入排序(Insertion Sort)

插入排序的工作方式是通過構(gòu)建有序序列,對于未排序數(shù)據(jù),在已排序序列中從后向前掃描,找到相應(yīng)位置并插入。

原理和邏輯:

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

代碼實現(xiàn)

// 3. 插入排序
let arr = [2, 5, 8, 1, 3, 9, 6, 7];

const insertSort = (arr) => {
  let len = arr.length;
  for (let i = 1; i < len; i++) {
    let current = arr[i];
    let prev = i - 1;
    while (prev >= 0 && current < arr[prev]) {
      arr[prev + 1] = arr[prev];
      prev--;
    }
    arr[prev + 1] = current;
  }
  return arr;
};

console.log("insertSort:", insertSort(arr));
//insertSort: [1, 2, 3, 5, 6, 7, 8, 9]

4. 快速排序(Quick Sort)

快速排序是一種分而治之的算法,它通過一個基準值將數(shù)據(jù)分為兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)要小,然后再遞歸地對這兩部分數(shù)據(jù)分別進行快速排序。

原理和邏輯:

  • 選擇一個基準值,通常選擇第一個元素或者中間元素;
  • 重新排序數(shù)組,所有比基準值小的元素擺放在基準前面,所有比基準值大的元素擺在基準后面(相同的數(shù)可以到任一邊)。在這個分區(qū)退出之后,該基準就處于數(shù)組的中間位置;
  • 遞歸地(recursive)把小于基準值元素的子數(shù)組和大于基準值元素的子數(shù)組排序。

代碼實現(xiàn)

// 4. 快速排序
let arr = [2, 5, 8, 1, 3, 9, 6, 7];

function quickSort(arr){
  if(arr.length <2 ) return arr
  let first = arr[0]
  let left = [], right=[]
  for(let i = 1 ; i <arr.length; i++){
    if(first > arr[i]){
      right.push(arr[i])
    }else{
      left.push(arr[i])
    }
  }
  return [...quickSort(left) , first , ...quickSort(right)]
} 

console.log('quickSort:',quickSort(arr));
//quickSort: [1, 2, 3, 5, 6, 7, 8, 9]

5. 歸并排序(Merge Sort)

歸并排序是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法(Divide and Conquer)的一個非常典型的應(yīng)用。

原理和邏輯:

  • 把長度為n的輸入序列分成兩個長度為n/2的子序列;
  • 對這兩個子序列分別采用歸并排序;
  • 將兩個排序好的子序列合并成一個最終的排序序列。

代碼實現(xiàn)

// 5. 歸并排序
let arr = [2, 5, 8, 1, 3, 9, 6, 7];

function mergeSort(arr) {
  if (arr.length < 2) return arr;
  let middle = Math.floor(arr.length / 2);
  let left = arr.slice(0, middle);
  let right = arr.slice(middle, arr.length);

  return merge(mergeSort(left), mergeSort(right));
}

function merge(left, right) {
  let result = [];
  while (left.length && right.length) {
    if (left[0] < right[0]) {
      result.push(left.shift());
    } else {
      result.push(left.shift());
    }
  }
  // 這也可以采用 while
  if (left.length) {
    result.push(...left);
  }

  if (right.length) {
    result.push(...right);
  }
  return result;
}

console.log("mergeSort:", mergeSort(arr));
//mergeSort: [1, 2, 3, 5, 6, 7, 8, 9]

總結(jié) 

到此這篇關(guān)于前端必須掌握的五種常用排序算法總結(jié)的文章就介紹到這了,更多相關(guān)前端排序算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Bootstrap源碼解讀導(dǎo)航條(7)

    Bootstrap源碼解讀導(dǎo)航條(7)

    這篇文章主要源碼解讀了Bootstrap導(dǎo)航條,介紹了Bootstrap各式各樣的導(dǎo)航條,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 微信小程序 頁面跳轉(zhuǎn)傳值實現(xiàn)代碼

    微信小程序 頁面跳轉(zhuǎn)傳值實現(xiàn)代碼

    這篇文章主要介紹了微信小程序 頁面跳轉(zhuǎn)傳值實現(xiàn)代碼的相關(guān)資料,這里分析實現(xiàn)的條件及實例代碼,需要的朋友可以參考下
    2017-07-07
  • JavaScript中的事件委托及好處

    JavaScript中的事件委托及好處

    事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是讓別人來做,這個事件本來是加在某些元素上的,然而你卻加到別人身上來做,完成這個事件,本文給大家重點介紹js中的事件委托及好處,一起看看吧
    2016-07-07
  • 原生JavaScript實現(xiàn)todolist功能

    原生JavaScript實現(xiàn)todolist功能

    本篇文章給大家介紹了通過原生JavaScript實現(xiàn)todolist功能相關(guān)知識點,對此有需要的朋友可以學(xué)習(xí)下。
    2018-03-03
  • JavaScript防抖與節(jié)流超詳細全面講解

    JavaScript防抖與節(jié)流超詳細全面講解

    在開發(fā)中我們經(jīng)常會遇到一些高頻操作,比如:鼠標移動,滑動窗口,鍵盤輸入等等,節(jié)流和防抖就是對此類事件進行優(yōu)化,降低觸發(fā)的頻率,以達到提高性能的目的。本文就教大家如何實現(xiàn)一個讓面試官拍大腿的防抖節(jié)流函數(shù),需要的可以參考一下
    2022-10-10
  • JS使用面向?qū)ο蠹夹g(shù)實現(xiàn)的tab選項卡效果示例

    JS使用面向?qū)ο蠹夹g(shù)實現(xiàn)的tab選項卡效果示例

    這篇文章主要介紹了JS使用面向?qū)ο蠹夹g(shù)實現(xiàn)的tab選項卡效果,結(jié)合具體實例形式分析了js面向?qū)ο蠹夹g(shù)與tab選項卡功能的具體實現(xiàn)技巧,需要的朋友可以參考下
    2017-02-02
  • JS獲得URL超鏈接的參數(shù)值實例代碼

    JS獲得URL超鏈接的參數(shù)值實例代碼

    使用js獲取超鏈接中keyword的參數(shù)值,具體實現(xiàn)代碼如下,感興趣的朋友可以參考下哈,希望對大家有所幫助
    2013-06-06
  • 通過身份證號得到出生日期和性別的js代碼

    通過身份證號得到出生日期和性別的js代碼

    主要是通過判斷指定位數(shù)的數(shù)字,來判斷并加以算法實現(xiàn)男女性別的判斷。
    2009-11-11
  • AngularJs+Bootstrap實現(xiàn)漂亮的計算器

    AngularJs+Bootstrap實現(xiàn)漂亮的計算器

    這篇文章主要為大家詳細介紹了angularJs+Bootstrap實現(xiàn)漂亮的計算器,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 微信小程序錄音與播放錄音功能

    微信小程序錄音與播放錄音功能

    這篇文章主要介紹了微信小程序錄音與播放錄音功能,小程序中提供了兩種錄音的API,舊版本錄音功能和新版錄音功能,需要的朋友可以參考下
    2017-12-12

最新評論

敦煌市| 娄烦县| 乐业县| 中宁县| 荔浦县| 宜兴市| 庆云县| 油尖旺区| 西丰县| 利川市| 麻栗坡县| 玉田县| 泸水县| 阳西县| 定安县| 马关县| 崇信县| 河池市| 山阴县| 平武县| 宁乡县| 大新县| 河间市| 西乡县| 松潘县| 天门市| 曲周县| 上高县| 华宁县| 新兴县| 淮北市| 翁牛特旗| 南郑县| 阿拉善盟| 绥宁县| 嵊泗县| 邯郸市| 集安市| 高青县| 永宁县| 洛阳市|