精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

程序員必備的幾種常見排序算法和搜索算法總結

開發 前端
我們在學排序算法時, 最容易掌握的就是冒泡排序, 因為其實現起來非常簡單,但是從運行性能的角度來看, 它卻是性能最差的一個。

前言

最近為了鞏固一下自己的算法基礎,又把算法書里的基本算法刷了一遍, 特地總結一下前端工程師需要了解的排序算法和搜索算法知識,雖然還有很多高深算法需要了解, 但是基礎還是要好好鞏固一下的.本文將以圖文的形式為大家介紹如下算法知識,希望在讀完之后大家能有所收獲:

  • 冒泡排序及其優化
  • 選擇排序
  • 插入排序
  • 歸并排序
  • 快速排序
  • 順序搜索
  • 二分搜索

正文

我想對于每個前端工程師來說, 最頭疼的就是算法問題, 但是算法往往也是衡量一個人編程能力的一個很重要的指標.目前很多主流框架和庫都應用了大量的算法和設計模式,為了讓自己的段位更高,我們只能不斷的"打怪"(也就是刷算法)升級,才能成為"最強王者".

其實前端發展這么多年, 越來越偏向于精細化開發, 很多超級應用(比如淘寶,微信)都在追求極致的用戶體驗, 時間就是金錢,這要求工程師們不能像以前那樣,開發的程序只要能用就行, 我們往往還要進行更加細致的測試(包括單元測試, 性能測試等),就拿排序來說, 對于大規模數據量的排序, 我們采用冒泡排序肯定是要被瘋狂吐槽的,因為冒泡排序的性能極差(復雜度為O(n^2).在真實項目中我們往往不會采用冒泡排序,

有詳細介紹. 接下來就讓我們來一起學習如何實現文章開頭的幾個常用排序和搜索算法吧.

1. 冒泡排序及其優化

我們在學排序算法時, 最容易掌握的就是冒泡排序, 因為其實現起來非常簡單,但是從運行性能的角度來看, 它卻是性能最差的一個.

冒泡排序的實現思路是比較任何兩個相鄰的項, 如果前者比后者大, 則將它們互換位置.

為了更方便的展示冒泡排序的過程和性能測試,筆者先寫幾個工具方法,分別為動態生成指定個數的隨機數組, 生成元素位置序列的方法,代碼如下:

// 生成指定個數的隨機數組
const generateArr = (num = 10) => {
let arr = []
for(let i = 0; i< num; i++) {
let item = Math.floor(Math.random() * (num + 1))
arr.push(item)
}
return arr
}

// 生成指定個數的元素x軸坐標
const generateArrPosX = (n= 10, w = 6, m = 6) => {
let pos = []
for(let i = 0; i< n; i++) {
let item = (w + m) * i
pos.push(item)
}
return pos
}

有了以上兩個方法,我們就可以生成任意個數的數組以及數組項坐標了,這兩個方法接下來我們會用到.

我們來直接寫個乞丐版的冒泡排序算法:

bubbleSort(arr = []) {
let len = arr.length
for(let i = 0; i< len; i++) {
for(let j = 0; j < len - 1; j++) {
if(arr[j] > arr[j+1]) {
// 置換
[arr[j], arr[j+1]] = [arr[j+1], arr[j]]
}
}
}
return arr
}

接下來我們來測試一下, 我們用generateArr方法生成60個數組項的數組, 并動態生成元素坐標:

// 生成坐標
const pos = generateArrPosX(60)
// 生成60個項的數組
const arr = generateArr(60)

執行代碼后會生成下圖隨機節點結構:

圖片

有關css部分這里就不介紹了,大家可以自己實現.接下來我們就可以測試我們上面寫的冒泡排序了,當我們點擊排序時,結果如下:

圖片

可以看到數組已按照順序排好了,我們可以使用console.time來測量代碼執行所用的時間,上面"乞丐版"冒泡排序耗時為0.2890625ms.


我們深入分析代碼就可以知道兩層for循環排序導致了很多多余的排序,如果我們從內循環減去外循環中已跑過的輪數,就可以避免內循環中不必要的比較,所以我們代碼優化如下:

// 冒泡排序優化版
bubbleSort(arr = []) {
let len = arr.length
// 優化
for(let i = 0; i< len; i++) {
for(let j = 0; j < len - 1 - i; j++) {
if(arr[j] > arr[j+1]) {
// 置換
[arr[j], arr[j+1]] = [arr[j+1], arr[j]]
}
}
}
return arr
}

經過優化的冒泡排序耗時:0.279052734375ms, 比之前稍微好了一丟丟, 但仍然不是推薦的排序算法.

2. 選擇排序

選擇排序的思路是找到數據結構中的最小值并將其放置在第一位,接著找到第二個最小值并將其放到第二位,依次類推.

我們還是按照之前的模式,生成一個60項的數組, 如下:

圖片

選擇排序代碼如下:

selectionSort(arr) {
let len = arr.length,
indexMin
for(let i = 0; i< len -1; i++) {
indexMin = i
for(let j = i; j < len; j++){
if(arr[indexMin] > arr[j]) {
indexMin = j
}
}
if(i !== indexMin) {
[arr[i], arr[indexMin]] = [arr[indexMin], arr[i]]
}
}
return arr
}

點擊排序時, 結果如下:

圖片

說明代碼運行正常, 可以實現排序, 控制臺耗時為: 0.13720703125ms, 明顯比冒泡排序性能要好.

3. 插入排序

插入排序的思路是每次排一個數組項,假定第一項已經排序,接著它和第二項比較, 決定第二項的位置, 然后接著用同樣的方式決定第三項的位置, 依次類推, 最終將整個數組從小到大依次排序.

代碼如下:

insertionSort(arr) {
let len = arr.length,
j,
temp;
for(let i = 1; i< len; i++) {
j = i
temp = arr[i]
while(j > 0 && arr[j-1] > temp) {
arr[j] = arr[j-1]
j--
}
arr[j] = temp;
}
}

執行結果如下:

圖片

控制臺打印耗時為:0.09912109375ms.

4. 歸并排序

歸并排序算法性能比以上三者都好, 可以在實際項目中投入使用,但實現方式相對復雜.

歸并排序是一種分治算法,其思想是將原始數組切分成較小的數組,直到每個小數組只有一個元素,接著將小數組歸并成較大的數組,最后變成一個排序完成的大數組。

其實現過程如下圖所示:

圖片

為了實現該方法我們需要準備一個合并函數和一個遞歸函數,具體實現如下代碼:

// 歸并排序
mergeSortRec(arr) {
let len = arr.length
if(len === 1) {
return arr
}
let mid = Math.floor(len / 2),
left = arr.slice(0, mid),
right = arr.slice(mid, len)
return merge(mergeSortRec(left), mergeSortRec(right))
}
// 合并方法
merge(left, right) {
let result = []
l = 0,
r = 0;
while(l < left.length && r < right) {
if(left[l] < right(r)) {
result.push(left[l++])
}else {
result.push(right[r++])
}
}
while(l < left.length) {
result.push(left[l++])
}
while(r < right.length) {
result.push(right[r++])
}
return result
}

以上代碼中的遞歸作用是將一個大數組劃分為多個小數組直到只有一項,然后再逐層進行合并排序。如果有不理解的可以和筆者交流或者結合筆者畫的草圖進行理解。??

圖片

5. 快速排序

快速排序是目前比較常用的排序算法,它的復雜度為O(nlog^n),并且它的性能比其他復雜度為O(nlog^n)的好,也是采用分治的思想,將原始數組進行劃分,由于快速排序實現起來比較復雜,這里講一下思路:

  1. 從數組中選擇中間項作為主元
  2. 創建兩個指針,左邊一個指向數組第一項,右邊一個指向數組最后一項,移動左指針直到我們找到一個比主元大的元素,移動右指針直到找到一個比主元小的元素,然后交換它們的位置,重復此過程直到左指針超過了右指針
  3. 算法對劃分后的小數組重復1,2步驟,直到數組完全排序完成。

代碼如下:

// 快速排序
quickSort(arr, left, right) {
let index
if(arr.length > 1) {
index = partition(arr, left, right)
if(left < index - 1) {
quickSort(arr, left, index -1)
}
if(index < right) {
quickSort(arr, index, right)
}
}
}
// 劃分流程
partition(arr, left, right) {
let part = arr[Math,floor((right + left) / 2)],
i = left,
j = right
while(i <= j) {
while(arr[i] < part) {
i++
}
while(arr[j] > part) {
j--
}
if(i <= j) {
// 置換
[arr[i], arr[j]] = [arr[j], arr[i]]
i++
j--
}
}
return i
}

7. 順序搜索

搜索算法也是我們經常用到的算法之一,比如我們需要查找某個用戶或者某條數據,不管是在前端還是在后端,都會使用搜索算法。我們先來介紹最簡單也是效率最低的順序搜索,其主要思想是將每一個數據結構中的元素和我們要查詢的元素做比較,然后返回指定元素的索引。

圖片

之所以說順序搜索效率低是因為每次都要從數組的頭部開始查詢,直到查找到要搜索的值,整體查詢不夠靈活和動態性。順序搜索代碼實現如下:

sequentialSearch(arr, item) {
for(let i = 0; i< arr.length; i++) {
if(item === arr[i]) {
return i
}
}
return -1
}

接下來我們看下面一種比較常用和靈活的搜索算法——二分搜索。

8. 二分搜索

二分搜索的思想有點“投機學”的意思,但是它是一種有理論依據的“投機學”。首先它要求被搜索的數據結構已排序,其次進行如下步驟:

  1. 找出數組的中間值
  2. 如果中間值是待搜索的值,那么直接返回中間值的索引
  3. 如果待搜索的值比中間值小,則返回步驟1,將區間范圍縮小,在中間值左邊的子數組中繼續搜索
  4. 如果待搜索的值比選中的值大,則返回步驟1,將區間范圍縮小,在中間值右邊的子數組中繼續搜索
  5. 如果沒有搜到,則返回-1

為了方便理解筆者畫了如下草圖:

圖片

由上圖大家可以很容易的理解二分搜索的實現過程,接下來我們看下代碼實現:

binarySearch(arr, item) {
// 調用排序算法先對數據進行排序
this.quickSort(arr)

let min = 0,
max = arr.length - 1,
mid,
el
while(min <= max) {
mid = Math.floor((min + max) / 2)
el = arr[mid]
if(el < item) {
min = mid + 1
}else if(el > item) {
max = mid -1
}else {
return mid
}
}
return -1
}

其實還有很多搜索算法,筆者在js基本搜索算法實現與170萬條數據下的性能測試有具體介紹。

參考文獻:Learning JavaScript Data Structures and Algorithms

責任編輯:武曉燕 來源: 趣談前端
相關推薦

2021-11-10 09:17:18

程序員排序算法搜索算法

2022-09-24 09:03:55

前端單元測試冒泡排序

2021-09-04 23:40:53

算法程序員前端

2011-01-04 11:02:08

程序員

2019-03-29 09:40:38

數據結構算法前端

2020-10-14 08:32:08

算法遞歸面試

2012-08-20 09:26:17

程序員算法排列算法

2011-02-17 09:11:40

JavaScript算法

2014-07-01 09:43:55

程序員算法

2009-01-07 21:00:05

2023-05-30 07:58:01

谷歌搜索算法

2025-02-26 05:00:00

DFS算法遞歸

2020-12-08 05:52:28

js前端算法

2018-06-04 12:41:50

程序員貪心算法分析

2022-12-07 10:21:19

谷歌搜索技巧

2023-11-30 08:09:05

2018-10-12 15:15:45

電商搜索算法

2012-02-29 13:32:28

Java

2020-11-25 10:40:58

程序員技能開發者

2021-01-19 15:59:14

程序員算法
點贊
收藏

51CTO技術棧公眾號

欧美高清免费| 一级做a爱片性色毛片| 午夜视频在线观看精品中文| 国产精品影音先锋| 亚洲国产精品网站| 日本欧美视频在线观看| 免费的毛片视频| 国产精品中文字幕亚洲欧美| 欧美日韩免费一区二区三区| 欧美在线观看视频免费| 99re只有精品| 羞羞色午夜精品一区二区三区| 国产精品久久久一本精品| 亚洲男人天堂久| 日本一本中文字幕| 高清一区二区三区四区| 红桃视频欧美| 日韩亚洲欧美成人| 成品人视频ww入口| 欧美一级在线免费观看| 国产精品毛片| 久久精品欧美视频| 黄色网址在线视频| 日本成人三级| 少妇特黄一区二区三区| 久久久久黄色| 一区二区视频在线| 成人网在线视频| 国产午夜手机精彩视频| 另类中文字幕国产精品| 欧美极品美女视频| 欧美专区在线播放| 国产精品99精品| 欧美成人高清| 久久精品99久久香蕉国产色戒| 免费无码毛片一区二三区| 国产精品国产三级国产普通话对白| 国产精品va| 亚洲精品理论电影| 玖玖爱视频在线| 久久久久久久久免费视频| 国产网红主播福利一区二区| 久久一区二区精品| 亚洲女同志亚洲女同女播放| 老司机精品视频在线| 欧美在线xxx| 性色av蜜臀av色欲av| 2020最新国产精品| 亚洲欧洲日韩av| 日本二三区不卡| 国产伦精品免费视频| 五月天色婷婷丁香| 日韩理论电影大全| 中文字幕日韩在线观看| 亚洲日本精品视频| 国产一区二区三区四区五区传媒 | 高清欧美精品xxxxx| 国产激情在线观看| 亚洲日本一区二区三区| 艳母动漫在线免费观看| 麻豆影院在线| 亚洲黄色免费电影| 国产一区二区三区小说| 黄色网址视频在线观看| **性色生活片久久毛片| 最新av在线免费观看| 91麻豆国产福利在线观看宅福利| 亚洲免费在线电影| 日韩精品在线观看av| 乡村艳史在线观看| 一本到不卡精品视频在线观看| 国产一区视频免费观看| 欧美暴力调教| 91精品婷婷国产综合久久性色 | eeuss鲁片一区二区三区| 91精品国产综合久久国产大片 | ccyy激情综合| 亚洲精品自在久久| jizzjizzjizz国产| 性欧美欧美巨大69| 97国产真实伦对白精彩视频8| 欧美h在线观看| 免费看欧美女人艹b| 热久久这里只有| 国产精品久久久午夜夜伦鲁鲁| 国产一区二区三区不卡在线观看| 粉嫩av一区二区三区免费观看| 视频二区在线观看| 久久综合999| 久久精品国产第一区二区三区最新章节 | 国产精品无码天天爽视频| 激情久久久久久久久久久久久久久久| 99国精产品一二二线| 超碰在线观看99| 久久久噜噜噜久噜久久综合| 自拍偷拍99| 国产白浆在线免费观看| 欧洲av一区二区嗯嗯嗯啊| 一起操在线视频| 欧美深夜视频| 久久精品国产一区二区电影| 青青青国产在线 | 91成人免费在线视频| 亚洲制服中文字幕| 猛男gaygay欧美视频| 大胆欧美人体视频| 狠狠狠狠狠狠狠| 国产suv精品一区二区三区| 日本一区二区高清视频| 日韩影视在线| 欧美群妇大交群的观看方式| 少妇饥渴放荡91麻豆| 亚洲色图二区| 国产精品久久久久久久9999| 四虎永久在线观看| 亚洲国产专区| 欧美一区二区三区免费视| 99国产精品99| 中文欧美字幕免费| 国产精品永久入口久久久| www.天堂av.com| 国产精品入口麻豆原神| 六月丁香婷婷激情| 成人另类视频| 欧美精品免费在线观看| 亚洲一区二区三区网站| 国产喷白浆一区二区三区| 九色自拍视频在线观看| 日韩视频在线直播| www.日韩欧美| 中文字幕av久久爽| 久久综合色婷婷| 成人免费观看cn| 亚洲国产一区二区三区网站| 色偷偷888欧美精品久久久| 日韩免费av网站| 久久综合九色综合欧美98| 精品少妇人妻av免费久久洗澡| 国产成人精品一区二区三区视频 | 国产精品日韩欧美一区二区| 中文字幕伦理免费在线视频 | 91久色国产| 国产在线69| 777a∨成人精品桃花网| 成年人二级毛片| 国产中文一区二区三区| 中文字幕精品—区二区日日骚| 成人久久网站| 色偷偷91综合久久噜噜| 国产又大又长又粗| 亚洲人成伊人成综合网小说| 五月花丁香婷婷| 国产韩国精品一区二区三区| 91精品久久久久久久久久久| 黄色精品免费看| 欧美一卡二卡在线观看| 精品亚洲乱码一区二区| 国产乱码精品一区二区三| 久久免费一级片| aiss精品大尺度系列| 55夜色66夜色国产精品视频| 男男激情在线| 欧美日韩在线亚洲一区蜜芽| 999久久久国产| 国产一区二区不卡在线| 国产精品一色哟哟| 亚洲成人一品| 国产精品视频资源| 黄色的网站在线观看| 日韩免费一区二区| 不卡的免费av| 久久精品视频在线免费观看| 老熟妇仑乱视频一区二区| 日韩av有码| y111111国产精品久久婷婷| 精精国产xxxx视频在线野外| 精品国产伦理网| 中文字字幕在线中文| 中文字幕在线观看不卡视频| 欧美色图校园春色| 亚洲欧美大片| 国产福利精品av综合导导航| 国产91久久久| 黄色网址在线播放| 亚洲一区二区视频| 97超碰在线资源| 国产一区不卡视频| 国内自拍在线观看| 91一区二区三区四区| 99在线视频免费观看| 国产在线拍揄自揄拍视频| 亚洲美女久久久| 国产日产亚洲系列最新| 欧美日韩国产麻豆| 成人黄色短视频| 久久精品国产99| 亚洲美免无码中文字幕在线| 成人高清电影网站| 国产精品日韩在线观看| 大香伊人久久| 俺去亚洲欧洲欧美日韩| 人人妻人人玩人人澡人人爽| 欧美日韩一区三区四区| 91嫩草丨国产丨精品| 91色综合久久久久婷婷| 国产成人在线免费看| 91麻豆精品| 日韩免费av在线| 激情av在线播放| 视频直播国产精品| 99精品免费观看| 在线精品亚洲一区二区不卡| 国产精品免费人成网站酒店 | 国产精品亚洲不卡a| abab456成人免费网址| 久久久久久综合网天天| 久操视频在线播放| 亚洲人线精品午夜| 日本高清视频免费看| 91精品国产91久久久久久一区二区| 免费黄色网址在线| 亚洲成人动漫av| 欧美做爰爽爽爽爽爽爽| 国产欧美日韩视频在线观看| 中文在线永久免费观看| 粉嫩av一区二区三区| 91丨九色丨蝌蚪| 日本视频在线一区| 免费黄色福利视频| 亚洲久久成人| 成人免费观看在线| 国产主播一区| 国产精品一二三在线观看| 93在线视频精品免费观看| 视频一区视频二区视频三区高| 在线亚洲a色| 欧美日本韩国一区二区三区| 日韩精品a在线观看91| 精品一区二区三区视频日产| 极品一区美女高清| 国产伦精品一区二区三区照片91| 日韩第一区第二区| 成人av资源| 成人av影音| 国产欧美丝袜| 久久aimee| 久久精品ww人人做人人爽| 亚洲精品中文字幕99999| 久久综合一区二区三区| 综合伊思人在钱三区| 欧美精品亚洲| 精品色999| 一区二区三区四区| 午夜久久免费观看| 干日本少妇视频| 午夜精彩国产免费不卡不顿大片| 米仓穗香在线观看| 激情av一区| 女人和拘做爰正片视频| 久久激情一区| 日本中文字幕精品—区二区| 韩国av一区二区三区| 4438x全国最大成人| 国产精品综合一区二区三区| 国产精品一区二区在线免费观看| 99热99精品| 妺妺窝人体色WWW精品| 国产精品情趣视频| 青青草在线观看视频| 亚洲va天堂va国产va久| 怡红院av久久久久久久| 欧美久久免费观看| 亚洲av无码一区二区乱子伦 | 99re在线观看| 任你弄精品视频免费观看| 欧美午夜免费| 亚洲字幕久久| 北条麻妃在线视频观看| 麻豆精品蜜桃视频网站| 佐佐木明希电影| 久久久久久久国产精品影院| 国产精品麻豆一区| 亚洲丰满少妇videoshd| 亚洲欧美一二三区| 日韩女优毛片在线| 日本五码在线| 九九综合九九综合| 欧美电影网址| 99www免费人成精品| 国产一区二区欧美| 屁屁影院ccyy国产第一页| 日韩在线a电影| 免费看三级黄色片| 亚洲国产精品激情在线观看| 欧美日韩偷拍视频| 色av成人天堂桃色av| 精品黑人一区二区三区在线观看| 亚洲欧美日韩成人| 新版中文在线官网| 国产精品久久久久一区二区| 91成人在线精品视频| 亚洲国产欧美日韩| 日韩一级免费| 日本一二三区在线| 欧美激情在线一区二区| 国产在线观看免费av| 欧美日韩国产另类一区| 色吊丝在线永久观看最新版本| 久久天天躁狠狠躁夜夜躁 | 在线观看国产91| 日韩中文字幕观看| 久久久精品一区| 国产亚洲精彩久久| 欧美凹凸一区二区三区视频| 国产精品www.| 91视频福利网| 国产精品电影院| 男人天堂2024| 亚洲精品xxx| 丰满的护士2在线观看高清| 91精品综合久久久久久五月天| 精品免费视频| 老司机午夜av| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 日本人69视频| 久久久精品一品道一区| 日韩精品手机在线| 精品成人私密视频| 视频在线这里都是精品| 91性高湖久久久久久久久_久久99| 精品久久久亚洲| 国产精品无码一本二本三本色| a级精品国产片在线观看| 久久久久久久国产视频| 欧美一卡2卡3卡4卡| 老司机午夜在线视频| 国产主播喷水一区二区| 成人影视亚洲图片在线| 美女网站免费观看视频| 久久久久国产精品人| 国产嫩bbwbbw高潮| 亚洲欧美日韩在线高清直播| 在线免费av资源| 欧美极品日韩| 日本最新不卡在线| 天堂资源在线视频| 欧美日韩夫妻久久| 精品176二区| 999日本视频| 一区久久精品| 国产中文字幕一区二区| 欧美日韩国产精品专区| 国产最新视频在线观看| 国产精品久久久久久av福利软件| 欧美xxxx中国| 四虎成人在线播放| 亚洲一级在线观看| 婷婷色在线观看| 日韩免费视频在线观看| 欧美影院三区| 911av视频| 亚洲成人精品影院| 日韩一区av| 国产精品色视频| 婷婷亚洲图片| 亚洲精品第二页| 色婷婷亚洲婷婷| 黄色片网站在线观看| 国产欧美日韩综合精品二区| 久久久成人网| 一级性生活免费视频| 精品剧情在线观看| 中文字幕乱码在线播放| 亚洲一卡二卡三卡四卡无卡网站在线看| 久久精品99国产精品| 久久久久久欧美精品se一二三四| 亚洲精品美女免费| 91成人抖音| 国产天堂视频在线观看| 久久久久久日产精品| 97人妻人人澡人人爽人人精品| 久久久噜噜噜久久| 国产欧美日韩| 伊人久久久久久久久| 色嗨嗨av一区二区三区| 中文字幕在线观看播放| 清纯唯美一区二区三区| 国产乱码一区二区三区| 国产熟妇一区二区三区四区| 美女av一区二区三区| 亚洲区小说区| 国产成人av片| 欧美日韩视频在线第一区 | 国产免费一区二区三区最新6| 日本福利一区二区| 青春草视频在线观看| 性欧美大战久久久久久久免费观看| 国产经典欧美精品| 中文字幕精品一区二区精| 午夜精品免费视频|