精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产成人免费视频网站| 日韩一区欧美| 欧美系列亚洲系列| 一区不卡视频| 99久久精品免费看国产交换| 亚洲国产一区二区精品专区| 亚洲区免费影片| 国产精品久久久久久久av福利| 色av手机在线| 99re热视频这里只精品| 国产精品视频白浆免费视频| 精品少妇一区二区三区密爱| 亚洲天堂中文字幕在线观看| 亚洲狠狠爱一区二区三区| 欧洲久久久久久| www.日韩在线观看| 日韩国产精品久久| 久久久伊人欧美| 一区二区三区在线播放视频| 日韩有码一区| 精品裸体舞一区二区三区| 人人干人人视频| av日韩中文| 亚洲人成人一区二区在线观看| 国产日韩一区欧美| 国产成人精品毛片| 久久精品国产免费| 国产成人精品综合久久久| 麻豆一区二区三区精品视频| 91亚洲自偷观看高清| 亚洲男人第一网站| 玖玖爱在线精品视频| 精品国产不卡一区二区| 欧美三级中文字幕| 日本成人在线免费视频| 嗯啊主人调教在线播放视频| 亚洲另类在线一区| 国产又爽又黄ai换脸| 丁香婷婷在线观看| 久久综合中文字幕| 九九九久久久| 日韩一区二区三区在线观看视频| 国产中文字幕一区| 成人妇女免费播放久久久| 伊人中文字幕在线观看| 一本色道久久| 2019中文字幕全在线观看| 亚洲精品在线观看av| 欧美三级第一页| 欧美成人中文字幕在线| 精品国产精品国产精品| 91精品高清| 免费av一区二区| 国产少妇在线观看| 欧美激情综合色综合啪啪| 欧美另类暴力丝袜| 久久97人妻无码一区二区三区| 中文字幕人成人乱码| 久久久国产一区二区三区| 永久免费看片视频教学| 91精品一区二区三区综合| 久久亚洲影音av资源网| 1024手机在线视频| 国产一区亚洲| 91精品国产91久久久久久最新| 日韩少妇高潮抽搐| 久久精品九九| 国产自摸综合网| 精品国产18久久久久久| 夫妻av一区二区| 激情小说综合区| 毛片免费在线| 亚洲欧洲精品成人久久奇米网| 日本黄色a视频| 三级福利片在线观看| 亚洲一区成人在线| 久热免费在线观看| 亚洲高清国产拍精品26u| 日韩一本二本av| 特级西西人体4444xxxx| 欧美精品一区二区久久| 久久伊人91精品综合网站| 久草成人在线视频| 美女爽到呻吟久久久久| 国产日韩欧美在线看| 午夜精品久久久久久久91蜜桃| 成人三级伦理片| 日韩精品最新在线观看| 中国av在线播放| 欧美日韩久久久久| 中文字幕一区久久| 精品自拍偷拍| 日韩在线播放视频| 国产成人在线观看网站| 麻豆精品在线看| 国产 高清 精品 在线 a| 蜜芽tv福利在线视频| **欧美大码日韩| 欧美老熟妇喷水| 欧美影院精品| 一本色道久久综合亚洲精品小说| 五月天色婷婷丁香| 性色av一区二区怡红| 亚洲va男人天堂| 韩国三级av在线免费观看| 一区二区三区小说| 深夜黄色小视频| 欧美日韩大片免费观看| 另类色图亚洲色图| 免费在线观看av的网站| 成人av免费在线观看| 在线不卡视频一区二区| 麻豆理论在线观看| 日韩免费观看高清完整版| 国产伦理片在线观看| 欧美精品国产一区| 国产区亚洲区欧美区| 完全免费av在线播放| 亚洲欧洲另类精品久久综合| 黑人另类精品××××性爽| 欧美日韩一区高清| 国产精品一区二区入口九绯色| 中文字幕亚洲精品乱码 | 精品成人无码久久久久久| 国产激情视频一区二区在线观看| 日韩欧美手机在线| 丝袜诱惑一区二区| 精品国精品自拍自在线| 国产一二三四区| 美腿丝袜亚洲一区| 青青草国产精品| 中文在线资源| 亚洲精品videossex少妇| 欧美日韩人妻精品一区二区三区| 久久精品99国产精品| 欧美在线一二三区| 婷婷电影在线观看| 亚洲精品av在线| 天天操天天干视频| bt欧美亚洲午夜电影天堂| 国产高清不卡无码视频| 成人在线啊v| 日韩在线观看免费全| 亚洲婷婷综合网| 26uuu精品一区二区三区四区在线| 欧美一级视频免费看| 97久久综合区小说区图片区| 欧美夫妻性生活xx| 精品人妻一区二区三区换脸明星| 亚洲另类色综合网站| 中文字幕第66页| 国产精品a级| 国产精品久久精品国产| 成人在线高清免费| 亚洲精品不卡在线| 国产精品一区二区三区四| 2023国产一二三区日本精品2022| av网站在线观看不卡| 蜜桃精品wwwmitaows| 1769国产精品| 国产经典自拍视频在线观看| 欧美在线三级电影| 潮喷失禁大喷水aⅴ无码| 久久99久久精品| 少妇高潮大叫好爽喷水| 天堂久久av| 91国自产精品中文字幕亚洲| 污视频软件在线观看| 一本久久综合亚洲鲁鲁五月天 | 亚洲午夜三级在线| 丝袜熟女一区二区三区 | 亚洲精品免费在线观看| 中文字幕在线视频精品| 欧美视频不卡| 免费一区二区三区在在线视频| 日韩久久一区二区三区| 神马国产精品影院av| www.av导航| 欧美色另类天堂2015| 欧美丰满美乳xxⅹ高潮www| 捆绑调教美女网站视频一区| 精品人妻人人做人人爽| 欧美挤奶吃奶水xxxxx| 国产精品男人的天堂| 婷婷色在线播放| 亚洲免费精彩视频| 国产精品久久久久久免费 | 成 年 人 黄 色 大 片大 全| 国产伦一区二区三区| 成人在线观看视频网站| 欧美在线极品| 日韩在线播放一区| 视频一区二区在线播放| 欧美精品日韩一本| 国产午夜在线播放| 亚洲天堂网中文字| 亚洲狠狠婷婷综合久久久久图片| 久久精品国产亚洲aⅴ| 欧美 日韩 国产在线观看| 日韩精品不卡一区二区| 国产有色视频色综合| 久久天天久久| 欧美在线视频观看| а√中文在线8| 亚洲人成在线电影| 丰满岳乱妇国产精品一区| 色婷婷av一区| 国产精品99精品无码视| 国产精品成人一区二区艾草| 中文字幕丰满乱子伦无码专区| 国产一区二区看久久| 激情综合网俺也去| 日韩视频三区| 黄色特一级视频| 亚洲不卡av不卡一区二区| 日韩电影天堂视频一区二区| 久久大胆人体视频| 亚洲最大的免费| 久久麻豆视频| 国产精品99久久久久久白浆小说| av3级在线| 欧美国产日韩xxxxx| 黄色成人在线观看| 中文字幕亚洲自拍| 狠狠色伊人亚洲综合网站l| 精品国产乱码久久久久久牛牛 | 影音先锋男人的网站| 精品视频亚洲| 日本精品二区| 免费成人网www| 精品欧美国产一区二区三区不卡| 日韩在线观看中文字幕| 91日本在线视频| 24小时成人在线视频| 国产精品igao视频| 成人免费网站视频| 欧亚精品在线观看| 日本不卡网站| 欧美专区中文字幕| 色戒汤唯在线| 国产91色在线免费| 在线高清av| 热99精品里视频精品| 中文字幕高清在线播放| 91禁国产网站| 自拍视频在线看| 国产v综合ⅴ日韩v欧美大片| sese综合| 国产精品欧美一区二区三区奶水| 精品亚洲美女网站| 国产精品久久久久久搜索| 日本一区二区三区视频在线| 国产成人一区二区在线| 成人黄色图片网站| 国产精品中文久久久久久久| 国产激情欧美| 91九色综合久久| 日韩在线观看一区二区三区| 国产精品久久波多野结衣| 另类尿喷潮videofree| 久久久福利视频| 国产探花一区二区| 亚洲欧洲免费无码| 国产精品97| 国产高清www| 亚洲欧美春色| 一道本视频在线观看| 人人狠狠综合久久亚洲| 九九九九九伊人| 国产suv一区二区三区88区| av在线播放网址| 国产午夜一区二区三区| 三级黄色在线观看| 亚洲午夜一区二区| 免费黄色av片| 69堂成人精品免费视频| 人人妻人人澡人人爽久久av| 国产丝袜一区二区三区| 91在线视频免费看| 欧美激情精品久久久久久大尺度| 麻豆理论在线观看| 国产欧美精品日韩精品| 中文一区二区三区四区| 欧美极品视频一区二区三区| 久久国产影院| 丰满少妇久久久| 久久国产精品99久久人人澡| 亚洲精品无码一区二区| 国产日韩精品一区| 欧美交换国产一区内射| 日韩欧美中文字幕在线观看| 亚洲网站免费观看| 亚洲国产精品99| 婷婷激情在线| 欧美一区二区三区免费视| 久久青草免费| 欧美1o一11sex性hdhd| 1024精品久久久久久久久| 俄罗斯av网站| 国产乱理伦片在线观看夜一区| 国产精品三级在线观看无码| 亚洲精品日日夜夜| 中文天堂在线视频| 亚洲精品电影在线| av在线导航| 国产精品aaaa| 日韩精品导航| 91亚洲精品国产| 久久se精品一区二区| 国产熟妇久久777777| 亚洲影视在线播放| 国产一区二区波多野结衣| 精品亚洲aⅴ在线观看| 日韩激情av| 成人免费淫片aa视频免费| 视频国产一区| 草草久久久无码国产专区| 国产成人a级片| 日本中文在线视频| 欧美在线你懂的| 黄色av免费在线观看| 欧美亚洲另类激情另类| 成人看片爽爽爽| 黄色一级片国产| 韩国欧美一区二区| 欧美极品jizzhd欧美18| 色综合久久88色综合天天6| 无码精品视频一区二区三区 | 国产91对白在线观看九色| 男人在线观看视频| 欧美日韩电影在线| 第一福利在线| 国产精品va在线播放| 免费短视频成人日韩| www.com毛片| 91影院在线观看| 国产精品久久久免费视频| 亚洲第一二三四五区| 美女精品视频| 国产精品xxxx| 亚洲一级特黄| 男人网站在线观看| 欧美日韩国产精品| 五月激情婷婷网| 欧美在线视频免费| 中国av一区| 欧美日韩怡红院| 中文字幕不卡在线观看| 中日韩av在线| 日韩在线视频网| 国产精品视频一区视频二区| 国产一二三四五| 成人午夜免费av| 尤物视频在线观看国产| 日韩精品在线私人| 欧美大胆成人| 亚洲制服欧美久久| 国内外成人在线| 久草资源在线视频| 亚洲精品福利在线| 美女100%一区| 亚洲国产精品www| 国产在线精品免费| 久草视频在线资源| 亚洲精品99999| 成人国产精品入口免费视频| 永久免费精品视频网站| 国产v综合v亚洲欧| 中文字幕在线欧美| 中文字幕在线国产精品| 国产精品xnxxcom| 色欲色香天天天综合网www| 久久久久久**毛片大全| 一区二区自拍偷拍| 欧美俄罗斯乱妇| 妖精一区二区三区精品视频 | 久久av国产紧身裤| 精品久久久噜噜噜噜久久图片| 日韩一区在线看| 姝姝窝人体www聚色窝| 国产福利成人在线| 综合一区av| 亚洲精品视频大全| 欧美精品久久一区| 成人av影院在线观看| 日韩欧美三级电影| 国产在线精品一区二区三区不卡| 国产中文字字幕乱码无限| 国产亚洲美女久久| jizz国产精品| 国产高潮免费视频| 亚洲二区在线观看| aaa日本高清在线播放免费观看| a级国产乱理论片在线观看99| 久久男女视频| 久久久无码精品亚洲国产| 亚洲日本欧美日韩高观看| 伊色综合久久之综合久久| chinese少妇国语对白| 亚洲国产精品欧美一二99|