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

JS數據結構與算法_排序和搜索算法

開發 前端 算法
這是《學習JavaScript數據結構與算法》的最后一篇博客,也是在面試中常常會被問到的一部分內容:排序和搜索。

 寫在前面

這是《學習JavaScript數據結構與算法》的***一篇博客,也是在面試中常常會被問到的一部分內容:排序和搜索。在這篇博客之前,我每每看到排序頭就是大的,心里想著類似“冒泡排序,兩層遍歷啪啪啪“就完事了,然后再也無心去深入研究排序相關的問題了。如果你也有類似的經歷,希望下面的內容對你有一定幫助

一、準備

在進入正題之前,先準備幾個基礎的函數

(1)交換數組兩個元素 

  1. function swap(arr, sourceIndex, targetIndex) {  
  2.   let temp = arr[sourceIndex];  
  3.   arr[sourceIndex] = arr[targetIndex];  
  4.   arr[targetIndex] = temp;  

(2)快速生成0~N的數組 可點擊查看更多生成方法 

  1. function createArr(length) {  
  2.   return Array.from({length}, (_, i) => i);  

(3)洗牌函數

洗牌函數可快速打亂數組,常見的用法如切換音樂播放順序 

  1. function shuffle(arr) {  
  2.   for (let i = 0; i < arr.length; i += 1) {  
  3.     const rand = Math.floor(Math.random() * (i + 1));  
  4.     if (rand !== i) {  
  5.       swap(arr, i, rand);  
  6.     }  
  7.   }  
  8.   return arr;  

二、排序

常見排序算法可以分為兩大類:

  •  比較類排序:通過比較來決定元素間的相對次序,由于其時間復雜度不能突破O(nlogn),因此也稱為非線性時間比較類排序
  •  非比較類排序:不通過比較來決定元素間的相對次序,它可以突破基于比較排序的時間下界,以線性時間運行,因此也稱為線性時間非比較類排序

在本篇博客中,僅對比較類排序的幾種排序方式進行學習介紹

2.1 冒泡排序

冒泡排序是所有排序算法中最簡單的,通常也是我們學習排序的入門方法。但是,從運行時間的角度來看,冒泡排序是最差的一種排序方式。

核心:比較任何兩個相鄰的項,如果***個比第二個大,則交換它們。元素項向上移動至正確的順序,就好像氣泡升至表面一樣,冒泡排序因而得名

注意:***層遍歷找出剩余元素的***值,至指定位置【依次冒泡出***值】

代碼: 

  1. function bubbleSort(arr) {  
  2.   const len = arr.length;  
  3.   for (let i = 0; i < len; i += 1) {  
  4.     for (let j = 0; j < len - 1 - i; j += 1) {  
  5.       if (arr[j] > arr[j + 1]) { // 比較相鄰元素  
  6.         swap(arr, j, j + 1);  
  7.       }  
  8.     }  
  9.   }  
  10.   return arr;  

2.2 選擇排序

選擇排序是一種原址比較排序算法。

核心:首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再從剩余未排序元素中繼續尋找最小元素,然后放到已排序序列的末尾。以此類推,直到所有元素均排序完畢

注意:***層遍歷找出剩余元素最小值的索引,然后交換當前位置和最小值索引值【依次找到最小值】

代碼: 

  1. function selectionSort(arr) {  
  2.   const len = arr.length;  
  3.   let minIndex;  
  4.   for (let i = 0; i < len - 1; i += 1) {  
  5.     minIndex = i;  
  6.     for (let j = i + 1; j < len; j += 1) {  
  7.       if (arr[minIndex] > arr[j]) {  
  8.         minIndex = j; // 尋找最小值對應的索引  
  9.       }  
  10.     }  
  11.     if (minIndex === i) continue;  
  12.     swap(arr, minIndex, i);  
  13.   }  
  14.   return arr;  

2.3 插入排序

插入排序的比較順序不同于冒泡排序和選擇排序,插入排序的比較順序是當前項向前比較。

核心:通過構建有序序列,對于未排序數據,在已排序序列中從后向前掃描,找到相應位置并插入

注意:從第二項開始,依次向前比較,保證當前項以前的序列是順序排列

代碼: 

  1. function insertionSort(arr) {  
  2.   const len = arr.length;  
  3.   let current, pointer;  
  4.   for (let i = 1; i < len; i += 1) {  
  5.     current = arr[i];  
  6.     pointer = i;  
  7.     while(pointer >= 0 && current < arr[pointer - 1]) { // 每次向前比較  
  8.       arr[pointer] = arr[pointer - 1]; // 前一項大于指針項,則向前移動一項  
  9.       pointer -1 
  10.     }  
  11.     arr[pointer] = current; // 指針項還原成當前項  
  12.   }  
  13.   return arr;  

2.4 歸并排序

歸并排序和快速排序相較于上面三種排序算法在實際中更具有可行性(在第四小節我們會通過實踐復雜度來比較這幾種排序算法)

JavaScript的Array類定義了一個sort函數(Array.prototype.sort)用以排序JavaScript數組。ECMAScript沒有定義用哪個排序算法,所以瀏覽器廠商可以自行去實現算法。例如,Mozilla Firefox使用歸并排序作為Array.prototype.sort的實現,而Chrome使用了一個快速排序的變體

歸并排序是一種分治算法。其思想是將原始數組切分成較小的數組,直到每個小數組只有一 個位置,接著將小數組歸并成較大的數組,直到***只有一個排序完畢的大數組。因此需要用到遞歸

核心:歸并排序,拆分成左右兩塊數組,分別排序后合并

注意:遞歸中最小的左右數組比較為單個元素的數組,因此在較上層多個元素對比時,左右兩個數組一定是順序的

代碼: 

  1. function mergeSort(arr) {  
  2.   const len = arr.length;  
  3.   if (len < 2) return arr; // 遞歸的終止條件  
  4.   const middle = Math.floor(len / 2); // 拆分左右數組  
  5.   const left = arr.slice(0, middle);  
  6.   const right = arr.slice(middle);  
  7.   return merge(mergeSort(left), mergeSort(right));  
  8.  
  9. function merge(left, right) { // 將左右兩側比較后進行合并  
  10.   const ret = [];  
  11.   while (left.length && right.length) {  
  12.     if (left[0] > right[0]) {  
  13.       ret.push(right.shift());  
  14.     } else {  
  15.       ret.push(left.shift());  
  16.     }  
  17.   }  
  18.   while (left.length) {  
  19.     ret.push(left.shift());  
  20.   }  
  21.   while (right.length) {  
  22.     ret.push(right.shift());  
  23.   }  
  24.   return ret;  

2.5 快速排序

快速排序也許是最常用的排序算法了。它的復雜度為O(nlogn),且它的性能通常比其他的復 雜度為O(nlogn)的排序算法要好。和歸并排序一樣,快速排序也使用分治的方法,將原始數組分為較小的數組

核心:分治算法,以參考值為界限,將比它小的和大的值拆開

注意:每一次遍歷篩選出比基準點小的值

代碼: 

  1. function quickSort(arr, left = 0right = arr.length - 1) {  
  2.   // left和right默認為數組首尾  
  3.   if (left < right) {  
  4.     let partitionpartitionIndex = partition(arr, left, right);  
  5.     quickSort(arr, left, partitionIndex - 1);  
  6.     quickSort(arr, partitionIndex + 1, right);  
  7.   }  
  8.   return arr;  
  9.  
  10. function partition(arr, left, right) {  
  11.   let pivot = left 
  12.   let index = left + 1; // 滿足比較條件的依次放在分割點后  
  13.   for (let i = index; i <= right; i += 1) {  
  14.     if (arr[i] < arr[pivot]) {  
  15.       swap(arr, i, index);  
  16.       index += 1;  
  17.     }  
  18.   }  
  19.   swap(arr, index - 1, pivot); // 交換順序時,以***一位替換分隔項  
  20.   return index - 1;  

三、搜索算法

3.1 順序搜索

順序或線性搜索是最基本的搜索算法。它的機制是,將每一個數據結構中的元素和我們要找的元素做比較。順序搜索是***效的一種搜索算法。 

  1. function findItem(item, arr) {  
  2.   for (let i = 0; i < arr.length; i += 1) {  
  3.     if (item === arr[i]) {  
  4.       return i;  
  5.     }  
  6.   }  
  7.   return -1;  

3.2 二分搜索

二分搜索要求被搜索的數據結構已排序。以下是該算法遵循的步驟:

  1.     選擇數組的中間值
  2.     如果選中值是待搜索值,那么算法執行完畢
  3.     如果待搜索值比選中值要小,則返回步驟1在選中值左邊的子數組中尋找
  4.     如果待搜索值比選中值要大,則返回步驟1在選中值右邊的子數組中尋找 
  1. function binarySearch(item, arr) {  
  2.   arr = quickSort(arr); // 排序  
  3.   let low = 0 
  4.   let high = arr.length - 1;  
  5.   let mid;  
  6.   while (low <= high) {  
  7.     min = Math.floor((low + high) / 2);  
  8.     if (arr[mid] < item) {  
  9.       low = mid + 1;  
  10.     } else if (arr[mid] > item) {  
  11.       high = mid - 1;  
  12.     } else {  
  13.       return mid;  
  14.     }  
  15.   }  
  16.   return -1;  

四、算法復雜度

4.1 理解大O表示法

大O表示法用于描述算法的性能和復雜程度。分析算法時,時常遇到一下幾類函數

(1)O(1) 

  1. function increment(num){  
  2.     return ++num;  

執行時間和參數無關。因此說,上述函數的復雜度是O(1)(常數)

(2)O(n)

以順序搜索函數為例,查找元素需要遍歷整個數組,直到找到該元素停止。函數執行的總開銷取決于數組元素的個數(數組大小),而且也和搜索的值有關。但是函數復雜度取決于最壞的情況:如果數組大小是10,開銷就是10;如果數組大小是1000,開銷就是1000。這種函數的時間復雜度是O(n),n是(輸入)數組的大小

(3)O(n2)

以冒泡排序為例,在未優化的情況下,每次排序均需進行n*n次執行。時間復雜度為O(n2)

時間復雜度O(n)的代碼只有一層循環,而O(n2)的代碼有雙層嵌套循環。如 果算法有三層遍歷數組的嵌套循環,它的時間復雜度很可能就是O(n3) 

4.2 時間復雜度比較

(1)常用數據結構時間復雜度

(2)排序算法時間復雜度

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2023-04-27 09:13:20

排序算法數據結構

2023-03-07 08:02:07

數據結構算法數列

2023-03-02 08:15:13

2023-03-10 08:07:39

數據結構算法計數排序

2023-03-13 10:08:31

數據結構算法

2023-03-08 08:03:09

數據結構算法歸并排序

2021-04-15 09:36:44

Java數據結構算法

2020-10-21 14:57:04

數據結構算法圖形

2021-03-23 08:33:22

Java數據結構算法

2021-07-16 04:57:45

Go算法結構

2023-10-27 07:04:20

2022-09-24 09:03:55

前端單元測試冒泡排序

2021-09-04 23:40:53

算法程序員前端

2023-02-09 07:39:01

2021-11-10 09:17:18

程序員排序算法搜索算法

2023-03-06 08:10:52

數據結構算法數據

2009-08-03 17:38:12

排序算法C#數據結構

2023-04-14 08:07:20

數據結構算法搜索

2021-04-22 10:07:45

Java數據結構算法

2021-04-16 09:40:52

Java數據結構算法
點贊
收藏

51CTO技術棧公眾號

91香蕉视频在线下载| 亚洲国产欧美一区二区丝袜黑人| 日韩欧美一区二区视频在线播放| 日产精品久久久| 九九热精品视频在线观看| 午夜精品久久一牛影视| 久久99精品久久久久子伦| 国产亚洲欧美在线精品| 日韩欧美午夜| 日韩欧美一区电影| 色综合av综合无码综合网站| 狠狠v欧美ⅴ日韩v亚洲v大胸 | 福利一区福利二区| 午夜精品久久久久久久白皮肤| 亚洲av无码成人精品国产| 亚洲不卡系列| 亚洲激情图片一区| 国产专区一区二区三区| 欧美在线视频精品| 国产精品大片| 亚洲欧美国内爽妇网| 国产福利在线免费| 电影在线观看一区| 国产精品久久久久久久裸模| 97中文在线观看| 亚洲 欧美 中文字幕| 66国产精品| 精品视频一区在线视频| 男生操女生视频在线观看 | 亚洲图片激情小说| 久久99影院| 国产精品久久欧美久久一区| 一本综合久久| 久久这里只有精品99| 在线观看国产免费视频| 四虎精品一区二区免费| 狠狠做深爱婷婷久久综合一区| 亚洲欧美日韩在线综合| 色欲av永久无码精品无码蜜桃| 日韩电影网1区2区| 国内免费久久久久久久久久久 | 国产又粗又长又爽视频| 午夜性色福利视频| 国产福利一区二区三区| 国产精品久久久久久久久久ktv | 亚洲成人三区| 一个人看的www久久| 无码人妻久久一区二区三区蜜桃| 欧亚av在线| 一区二区三区日韩精品视频| 亚洲乱码国产乱码精品天美传媒| 神马久久高清| 粉嫩av一区二区三区| 成人女保姆的销魂服务| 久久午夜免费视频| 国产综合精品| 久久天天躁日日躁| 四虎影视1304t| 九九热爱视频精品视频| 亚洲国产精品人人爽夜夜爽| 欧美又黄又嫩大片a级| 免费在线成人激情电影| 欧美性猛交丰臀xxxxx网站| 久艹在线免费观看| 污污视频在线看| 亚洲欧洲综合另类| 亚洲日本一区二区三区在线不卡| 免费人成在线观看网站| 972aa.com艺术欧美| 高清国产在线一区| 精品国精品国产自在久不卡| 精品一区二区三区在线视频| 国产精品福利小视频| 午夜久久久久久久久久影院| 久久婷婷av| 日韩美女福利视频| 国产熟妇一区二区三区四区| 免费在线成人| 性色av香蕉一区二区| 日本熟女一区二区| 日韩午夜黄色| 欧美怡春院一区二区三区| 日韩精品成人在线| 国产一区二区三区久久久久久久久| 国产做受高潮69| 亚洲精品77777| 久久国产日韩| 国产精品入口免费视频一| 国产情侣呻吟对白高潮| 久久精品国产亚洲一区二区三区| 国产精品丝袜一区二区三区| 国产一区二区网站| 国产精品1024| 国产精品一 二 三| 天堂中文字幕在线| 国产农村妇女精品| 特级毛片在线免费观看| 色噜噜狠狠狠综合欧洲色8| 亚洲韩国一区二区三区| 91视频 -- 69xx| jizzjizz中国精品麻豆| 日韩欧美中文在线| 国产精品视频分类| 国产亚洲亚洲国产一二区| 精品国产一区二区在线观看| 午夜影院福利社| 影视先锋久久| 美乳少妇欧美精品| 五月婷婷激情网| 男男视频亚洲欧美| 666精品在线| 天天干天天爱天天操| 久久亚洲春色中文字幕久久久| 天堂√在线观看一区二区| 国产精品va在线观看视色| 亚洲二区在线观看| wwwwww.色| 91蜜桃臀久久一区二区 | 午夜在线观看视频18| 中文字幕免费观看一区| 国产精品igao激情视频| caoporn视频在线观看| 欧美日韩视频在线第一区| 久久久精品人妻一区二区三区| 国产一区二区在线视频你懂的| 伊人久久久久久久久久| 国产亚洲成人精品| 美国一区二区三区在线播放| 国产区二精品视| 男人天堂综合| 亚洲综合网站在线观看| 久草在在线视频| 成人免费直播在线| 日韩在线免费视频观看| 在线天堂中文字幕| 国产成人高清在线| 亚洲色图自拍| 色尼玛亚洲综合影院| 亚洲成人av在线播放| 99热在线观看精品| 在线日本成人| 91手机视频在线观看| 精品久久av| 亚洲v日本v欧美v久久精品| 中文字幕色网站| 精品国产不卡| 欧美一级黑人aaaaaaa做受| а√天堂资源在线| 中文字幕欧美一| 中文字幕无码不卡免费视频| 国产区精品视频在线观看豆花| 日韩有码片在线观看| 国产精品第6页| 久久精品在线免费观看| 丰满爆乳一区二区三区| 69精品国产久热在线观看| 久久久91精品| 97超碰中文字幕| 国产精品素人一区二区| 亚洲狼人综合干| 久久99视频| 欧洲美女免费图片一区| 婷婷视频在线观看| 亚洲成人黄色影院| 这里只有精品在线观看视频| 国产综合色产| www日韩av| 亚洲按摩av| 日韩精品一区二区三区三区免费| 自拍偷拍第9页| 麻豆精品国产传媒mv男同| 五月天综合网| 91p九色成人| 中文字幕在线看视频国产欧美在线看完整| 国产精品第九页| 97se亚洲国产综合自在线观| 欧美一区二区三区爽大粗免费| 菁菁伊人国产精品| 免费97视频在线精品国自产拍| 亚洲一级片免费看| 自拍偷拍国产精品| 欧美体内she精高潮| 欧美日韩国产精品一区二区亚洲| 亚洲综合小说区| 九色91在线| 日韩精品免费观看| 五月婷婷色丁香| 久久久国产一区二区三区四区小说| www.色就是色| 久久久久久美女精品 | 国产精品视频999| 日本在线观看www| 精品国产一区二区亚洲人成毛片| 在线观看精品国产| 久久精品一区二区三区不卡| 成人免费在线观看视频网站| 91tv官网精品成人亚洲| 97中文在线观看| 伊人久久国产| 亚洲天堂av电影| 国产精品久久影视| 精品动漫一区二区| 男人的天堂av网| 黑人精品欧美一区二区蜜桃 | 亚洲毛片av| 青娱乐国产91| 国产亚洲高清在线观看| 久久久久久亚洲| 久久久久久女乱国产| 91 com成人网| 国产精品乱子伦| 亚洲欧洲www| 欧美一级片黄色| 麻豆成人综合网| 2018国产在线| 欧美电影一二区| 精品午夜一区二区三区| 福利视频一区| 91禁外国网站| 久草免费在线| 亚洲美女又黄又爽在线观看| 国产精品久久免费| 色婷婷亚洲综合| 九九视频免费看| 国产日韩亚洲欧美综合| 337p日本欧洲亚洲大胆张筱雨| 亚洲一区自拍| 黄色a级片免费看| 久久资源中文字幕| 久久本道综合色狠狠五月| 全球中文成人在线| 欧美中文字幕视频在线观看| 图片区小说区亚洲| 中文字幕亚洲精品| 人妻妺妺窝人体色www聚色窝| 欧美视频完全免费看| 国产成人精品网| 一区二区三区在线免费视频| 卡一卡二卡三在线观看| thepron国产精品| 亚洲三级在线视频| 久久精品久久精品| 日本免费观看网站| 国产精品三上| 轻点好疼好大好爽视频| 五月久久久综合一区二区小说| 欧洲精品国产| 在线观看欧美理论a影院| 不卡视频一区二区三区| 成人国产网站| 国产精品欧美久久久| 欧美videos另类精品| 久久精品精品电影网| av中文天堂在线| 亚洲色无码播放| 四虎电影院在线观看| 亚洲激情第一页| 免费国产精品视频| 亚洲成人教育av| 亚洲精品国产一区二| 日韩精品一区国产麻豆| 国产精品久久久久久免费播放| 欧美日韩视频在线一区二区 | 夜夜夜久久久| 欧美黄色一级片视频| 蜜臀精品久久久久久蜜臀| 天堂在线中文在线| 粉嫩av一区二区三区在线播放| 男生裸体视频网站| 国产精品私房写真福利视频| 欧美大片xxxx| 亚洲第一主播视频| а中文在线天堂| 日韩一区和二区| 91久久精品www人人做人人爽| 激情视频网站在线播放色| 欧美在线亚洲在线| 成人深夜福利| 99视频在线免费观看| 色愁久久久久久| 污视频在线免费观看一区二区三区| 欧美3p视频| 成品人视频ww入口| 老司机精品福利视频| 日本精品一区在线| 99国产精品99久久久久久| 永久免费av无码网站性色av| 一区二区三区欧美日韩| 亚洲天堂av片| 欧美一区二区在线视频| 天堂av中文在线资源库| 日韩在线一区二区三区免费视频| 色黄网站在线观看| 国产精品第一视频| 电影一区二区在线观看| 亚洲国产欧美一区二区三区不卡| 狠狠综合久久| 在线观看国产一级片| 91偷拍与自偷拍精品| 成人一级黄色大片| 色美美综合视频| 黄色片网站免费在线观看| 国产一区二区三区视频在线观看| 五月天激情在线| 国产精品综合网站| 三级精品视频| 国产成人永久免费视频| 久久成人综合网| av小说在线观看| 亚洲一二三区不卡| 亚洲怡红院av| 亚洲一区第一页| 精精国产xxxx视频在线野外| 国产在线观看精品一区二区三区| 亚洲婷婷影院| 久久这里只有精品23| 喷水一区二区三区| 国产男女猛烈无遮挡a片漫画| 一区二区三区欧美| 国产麻豆91视频| 在线国产精品视频| 中文在线аv在线| 国产欧美一区二区视频| 欧美日韩国产色综合一二三四| 亚洲免费av一区| 欧美高清在线精品一区| 黄色一级视频免费看| 亚洲精品美女网站| 国产传媒av在线| 国产精品免费一区二区三区四区| 小说区亚洲自拍另类图片专区 | 日本美女一区| 久草热久草热线频97精品| 狠狠爱综合网| 午夜福利三级理论电影| 亚洲一区二区在线免费看| 国产三级午夜理伦三级| 久久精品电影网站| 成人激情久久| 国产树林野战在线播放| 韩国av一区二区三区| 日本高清不卡免费| 欧美一区二区视频在线观看2022 | 亚洲自拍偷拍另类| 中文字幕一精品亚洲无线一区| av在线日韩| 午夜精品一区二区在线观看 | 国产suv精品一区二区| 日韩欧美国产大片| 精品99在线视频| 久久综合久久综合久久综合| 人妻丰满熟妇av无码区| 亚洲欧美精品在线| 成人欧美一区二区三区的电影| 免费中文日韩| 蜜芽一区二区三区| 后入内射无码人妻一区| 91麻豆精品国产91久久久久久 | 凹凸成人精品亚洲精品密奴| 亚洲精品怡红院| 国产精品美女一区二区在线观看| 亚洲午夜精品久久久| 九色91av视频| 国产主播性色av福利精品一区| 欧美一级视频免费看| 99视频精品全部免费在线| 成年人视频在线免费看| 亚洲色图日韩av| 亚洲视频自拍| 日本阿v视频在线观看| 久久众筹精品私拍模特| 免费在线不卡av| 久久综合伊人77777| 国产精品sss在线观看av| 亚洲乱码中文字幕久久孕妇黑人| 国产欧美日韩视频在线观看| 国产婷婷一区二区三区久久| 久久久亚洲网站| 国产成人手机高清在线观看网站| www.亚洲高清| 亚洲国产另类av| 国产日本在线观看| 97人人模人人爽人人少妇| 久久精品人人| 成人免费毛片xxx| 亚洲国产中文字幕在线观看| 电影一区二区| 日韩黄色短视频| 最新中文字幕一区二区三区 | 国产精品亚洲天堂| 成人av免费在线播放| 久久国产香蕉视频| 欧美极品美女视频网站在线观看免费| 网友自拍一区| 在线一区二区不卡| 色屁屁一区二区| 久久不射影院| 一本一道久久久a久久久精品91| 国产精品18久久久久久vr | 日韩欧美一区二区免费|