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

十大經(jīng)典排序算法的JS版

開發(fā) 前端 算法
冒泡排序是一種簡單的排序算法。它重復(fù)地走訪過要排序的數(shù)列,一次比較兩個(gè)元素,如果它們的順序錯(cuò)誤就把它們交換過來。走訪數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換,也就是說該數(shù)列已經(jīng)排序完成。這個(gè)算法的名字由來是因?yàn)樵叫〉脑貢?jīng)由交換慢慢“浮”到數(shù)列的頂端。

前言

讀者自行嘗試可以想看源碼戳這(https://github.com/damonare/Sorts),博主在github建了個(gè)庫,讀者可以Clone下來本地嘗試。此博文配合源碼體驗(yàn)更棒哦

  • 這世界上總存在著那么一些看似相似但有完全不同的東西,比如雷鋒和雷峰塔,小平和小平頭,瑪麗和馬里奧,Java和javascript….當(dāng)年javascript為了抱Java大腿恬不知恥的讓自己變成了Java的干兒子,哦,不是應(yīng)該是跪舔,畢竟都跟了Java的姓了。可如今,javascript來了個(gè)咸魚翻身,幾乎要統(tǒng)治web領(lǐng)域,Nodejs,React Native的出現(xiàn)使得javascript在后端和移動端都開始占有了一席之地。可以這么說,在Web的江湖,

JavaScript可謂風(fēng)頭無兩,已經(jīng)坐上了頭把交椅。

  • 在傳統(tǒng)的計(jì)算機(jī)算法和數(shù)據(jù)結(jié)構(gòu)領(lǐng)域,大多數(shù)專業(yè)教材和書籍的默認(rèn)語言都是Java或者C/C+ +,O’REILLY家倒是出了一本叫做《數(shù)據(jù)結(jié)構(gòu)與算法javascript描述》的書,但不得不說,不知道是作者吃了shit還是譯者根本就沒校對,滿書的小錯(cuò)誤,這就像那種無窮無盡的小bug一樣,簡直就是讓人有種嘴里塞滿了shit的感覺,吐也不是咽下去也不是。對于一個(gè)前端來說,尤其是筆試面試的時(shí)候,算法方面考的其實(shí)不難(

十大排序算法或是和十大排序算法同等難度的

),但就是之前沒用javascript實(shí)現(xiàn)過或是沒仔細(xì)看過相關(guān)算法的原理,導(dǎo)致寫起來浪費(fèi)很多時(shí)間。所以擼一擼袖子決定自己查資料自己總結(jié)一篇博客等用到了直接看自己的博客就OK了,正所謂靠天靠地靠大牛不如靠自己(ˉ(∞)ˉ)。

  • 算法的由來:9世紀(jì)波斯數(shù)學(xué)家提出的:“al-Khowarizmi”就是下圖這貨(感覺重要數(shù)學(xué)元素提出者貌似都戴了頂白帽子),開個(gè)玩笑,阿拉伯人對于數(shù)學(xué)史的貢獻(xiàn)還是值得人敬佩的。 

[[197157]] 

正文 

排序算法說明

(1)排序的定義:對一序列對象根據(jù)某個(gè)關(guān)鍵字進(jìn)行排序;

輸入:n個(gè)數(shù):a1,a2,a3,…,an

輸出:n個(gè)數(shù)的排列:a1’,a2’,a3’,…,an’,使得a1’

再講的形象點(diǎn)就是排排坐,調(diào)座位,高的站在后面,矮的站在前面咯。

(2)對于評述算法優(yōu)劣術(shù)語的說明

穩(wěn)定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;

不穩(wěn)定:如果a原本在b的前面,而a=b,排序之后a可能會出現(xiàn)在b的后面;

內(nèi)排序:所有排序操作都在內(nèi)存中完成;

外排序:由于數(shù)據(jù)太大,因此把數(shù)據(jù)放在磁盤中,而排序通過磁盤和內(nèi)存的數(shù)據(jù)傳輸才能進(jìn)行;

時(shí)間復(fù)雜度: 一個(gè)算法執(zhí)行所耗費(fèi)的時(shí)間。

空間復(fù)雜度: 運(yùn)行完一個(gè)程序所需內(nèi)存的大小。

關(guān)于時(shí)間空間復(fù)雜度的更多了解請戳這里(http://blog.csdn.net/booirror/article/details/7707551/),或是看書程杰大大編寫的《大話數(shù)據(jù)結(jié)構(gòu)》還是很贊的,通俗易懂。

(3)排序算法圖片總結(jié)(圖片來源于網(wǎng)絡(luò)):

排序?qū)Ρ龋?/p>

 

圖片名詞解釋:

n: 數(shù)據(jù)規(guī)模

k:“桶”的個(gè)數(shù)

In-place: 占用常數(shù)內(nèi)存,不占用額外內(nèi)存

Out-place: 占用額外內(nèi)存

排序分類:

 

1.冒泡排序(Bubble Sort)

好的,開始總結(jié)***個(gè)排序算法,冒泡排序。我想對于它每個(gè)學(xué)過C語言的都會了解的吧,這可能是很多人接觸的***個(gè)排序算法。

(1)算法描述

冒泡排序是一種簡單的排序算法。它重復(fù)地走訪過要排序的數(shù)列,一次比較兩個(gè)元素,如果它們的順序錯(cuò)誤就把它們交換過來。走訪數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換,也就是說該數(shù)列已經(jīng)排序完成。這個(gè)算法的名字由來是因?yàn)樵叫〉脑貢?jīng)由交換慢慢“浮”到數(shù)列的頂端。

(2)算法描述和實(shí)現(xiàn)

具體算法描述如下:

  • <1>.比較相鄰的元素。如果***個(gè)比第二個(gè)大,就交換它們兩個(gè);
  • <2>.對每一對相鄰元素作同樣的工作,從開始***對到結(jié)尾的***一對,這樣在***的元素應(yīng)該會是***的數(shù);
  • <3>.針對所有的元素重復(fù)以上的步驟,除了***一個(gè);
  • <4>.重復(fù)步驟1~3,直到排序完成。

JavaScript代碼實(shí)現(xiàn):

  1. function bubbleSort(arr) { 
  2.  
  3.     var len = arr.length; 
  4.  
  5.     for (var i = 0; i < len; i++) { 
  6.  
  7.         for (var j = 0; j < len - 1 - i; j++) { 
  8.  
  9.             if (arr[j] > arr[j+1]) {        //相鄰元素兩兩對比 
  10.  
  11.                 var temp = arr[j+1];        //元素交換 
  12.  
  13.                 arr[j+1] = arr[j]; 
  14.  
  15.                 arr[j] = temp
  16.  
  17.             } 
  18.  
  19.         } 
  20.  
  21.     } 
  22.  
  23.     return arr; 
  24.  
  25.  
  26. var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48]; 
  27.  
  28. console.log(bubbleSort(arr));//[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]  

改進(jìn)冒泡排序: 設(shè)置一標(biāo)志性變量pos,用于記錄每趟排序中***一次進(jìn)行交換的位置。由于pos位置之后的記錄均已交換到位,故在進(jìn)行下一趟排序時(shí)只要掃描到pos位置即可。

改進(jìn)后算法如下:

  1. function bubbleSort2(arr) { 
  2.  
  3.     console.time('改進(jìn)后冒泡排序耗時(shí)'); 
  4.  
  5.     var i = arr.length-1;  //初始時(shí),***位置保持不變 
  6.  
  7.     while ( i> 0) { 
  8.  
  9.         var pos= 0; //每趟開始時(shí),無記錄交換 
  10.  
  11.         for (var j= 0; j< i; j++) 
  12.  
  13.             if (arr[j]> arr[j+1]) { 
  14.  
  15.                 pos= j; //記錄交換的位置 
  16.  
  17.                 var tmp = arr[j]; arr[j]=arr[j+1];arr[j+1]=tmp; 
  18.  
  19.             } 
  20.  
  21.         i= pos; //為下一趟排序作準(zhǔn)備 
  22.  
  23.      } 
  24.  
  25.      console.timeEnd('改進(jìn)后冒泡排序耗時(shí)'); 
  26.  
  27.      return arr; 
  28.  
  29.  
  30. var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48]; 
  31.  
  32. console.log(bubbleSort2(arr));//[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]  

傳統(tǒng)冒泡排序中每一趟排序操作只能找到一個(gè)***值或最小值,我們考慮利用在每趟排序中進(jìn)行正向和反向兩遍冒泡的方法一次可以得到兩個(gè)最終值(***者和最小者) , 從而使排序趟數(shù)幾乎減少了一半。

改進(jìn)后的算法實(shí)現(xiàn)為:

  1. function bubbleSort3(arr3) { 
  2.  
  3.     var low = 0; 
  4.  
  5.     var high= arr.length-1; //設(shè)置變量的初始值 
  6.  
  7.     var tmp,j; 
  8.  
  9.     console.time('2.改進(jìn)后冒泡排序耗時(shí)'); 
  10.  
  11.     while (low < high) { 
  12.  
  13.         for (j= low; j< high; ++j) //正向冒泡,找到***者 
  14.  
  15.             if (arr[j]> arr[j+1]) { 
  16.  
  17.                 tmp = arr[j]; arr[j]=arr[j+1];arr[j+1]=tmp; 
  18.  
  19.             } 
  20.  
  21.         --high;                 //修改high值, 前移一位 
  22.  
  23.         for (j=high; j>low; --j) //反向冒泡,找到最小者 
  24.  
  25.             if (arr[j]<arr[j-1]) { 
  26.  
  27.                 tmp = arr[j]; arr[j]=arr[j-1];arr[j-1]=tmp; 
  28.  
  29.             } 
  30.  
  31.         ++low;                  //修改low值,后移一位 
  32.  
  33.     } 
  34.  
  35.     console.timeEnd('2.改進(jìn)后冒泡排序耗時(shí)'); 
  36.  
  37.     return arr3; 
  38.  
  39.  
  40. var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48]; 
  41.  
  42. console.log(bubbleSort3(arr));//[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]  

三種方法耗時(shí)對比:

 

由圖可以看出改進(jìn)后的冒泡排序明顯的時(shí)間復(fù)雜度更低,耗時(shí)更短了。讀者自行嘗試可以戳這,博主在github建了個(gè)庫,讀者可以Clone下來本地嘗試。此博文配合源碼體驗(yàn)更棒哦~~~

冒泡排序動圖演示: 

 

(3)算法分析

  • ***情況:T(n) = O(n)

當(dāng)輸入的數(shù)據(jù)已經(jīng)是正序時(shí)(都已經(jīng)是正序了,為毛何必還排序呢….)

  • 最差情況:T(n) = O(n2)

當(dāng)輸入的數(shù)據(jù)是反序時(shí)(臥槽,我直接反序不就完了….)

  • 平均情況:T(n) = O(n2)

2.選擇排序(Selection Sort)

表現(xiàn)最穩(wěn)定的排序算法之一(這個(gè)穩(wěn)定不是指算法層面上的穩(wěn)定哈,相信聰明的你能明白我說的意思2333),因?yàn)闊o論什么數(shù)據(jù)進(jìn)去都是O(n²)的時(shí)間復(fù)雜度…..所以用到它的時(shí)候,數(shù)據(jù)規(guī)模越小越好。唯一的好處可能就是不占用額外的內(nèi)存空間了吧。理論上講,選擇排序可能也是平時(shí)排序一般人想到的最多的排序方法了吧。

(1)算法簡介

選擇排序(Selection-sort)是一種簡單直觀的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再從剩余未排序元素中繼續(xù)尋找最小(大)元素,然后放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。

(2)算法描述和實(shí)現(xiàn)

n個(gè)記錄的直接選擇排序可經(jīng)過n-1趟直接選擇排序得到有序結(jié)果。具體算法描述如下:

  • <1>.初始狀態(tài):無序區(qū)為R[1..n],有序區(qū)為空;
  • <2>.第i趟排序(i=1,2,3…n-1)開始時(shí),當(dāng)前有序區(qū)和無序區(qū)分別為R[1..i-1]和R(i..n)。該趟排序從當(dāng)前無序區(qū)中-選出關(guān)鍵字最小的記錄 R[k],將它與無序區(qū)的第1個(gè)記錄R交換,使R[1..i]和R[i+1..n)分別變?yōu)橛涗泜€(gè)數(shù)增加1個(gè)的新有序區(qū)和記錄個(gè)數(shù)減少1個(gè)的新無序區(qū);
  • <3>.n-1趟結(jié)束,數(shù)組有序化了。

Javascript代碼實(shí)現(xiàn):

  1. function selectionSort(arr) { 
  2.  
  3.     var len = arr.length; 
  4.  
  5.     var minIndex, temp
  6.  
  7.     console.time('選擇排序耗時(shí)'); 
  8.  
  9.     for (var i = 0; i < len - 1; i++) { 
  10.  
  11.         minIndex = i; 
  12.  
  13.         for (var j = i + 1; j < len; j++) { 
  14.  
  15.             if (arr[j] < arr[minIndex]) {     //尋找最小的數(shù) 
  16.  
  17.                 minIndex = j;                 //將最小數(shù)的索引保存 
  18.  
  19.             } 
  20.  
  21.         } 
  22.  
  23.         temp = arr[i]; 
  24.  
  25.         arr[i] = arr[minIndex]; 
  26.  
  27.         arr[minIndex] = temp
  28.  
  29.     } 
  30.  
  31.     console.timeEnd('選擇排序耗時(shí)'); 
  32.  
  33.     return arr; 
  34.  
  35.  
  36. var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48]; 
  37.  
  38. console.log(selectionSort(arr));//[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]  

選擇排序動圖演示:

 

(3)算法分析

  • ***情況:T(n) = O(n2)
  • 最差情況:T(n) = O(n2)
  • 平均情況:T(n) = O(n2)

3.插入排序(Insertion Sort)

插入排序的代碼實(shí)現(xiàn)雖然沒有冒泡排序和選擇排序那么簡單粗暴,但它的原理應(yīng)該是最容易理解的了,因?yàn)橹灰蜻^撲克牌的人都應(yīng)該能夠秒懂。當(dāng)然,如果你說你打撲克牌摸牌的時(shí)候從來不按牌的大小整理牌,那估計(jì)這輩子你對插入排序的算法都不會產(chǎn)生任何興趣了…..

(1)算法簡介

插入排序(Insertion-Sort)的算法描述是一種簡單直觀的排序算法。它的工作原理是通過構(gòu)建有序序列,對于未排序數(shù)據(jù),在已排序序列中從后向前掃描,找到相應(yīng)位置并插入。插入排序在實(shí)現(xiàn)上,通常采用in-place排序(即只需用到O(1)的額外空間的排序),因而在從后向前掃描過程中,需要反復(fù)把已排序元素逐步向后挪位,為***元素提供插入空間。

(2)算法描述和實(shí)現(xiàn)

一般來說,插入排序都采用in-place在數(shù)組上實(shí)現(xiàn)。具體算法描述如下:

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

Javascript代碼實(shí)現(xiàn):

  1. function insertionSort(array) { 
  2.  
  3.     if (Object.prototype.toString.call(array).slice(8, -1) === 'Array') { 
  4.  
  5.         console.time('插入排序耗時(shí):'); 
  6.  
  7.         for (var i = 1; i < array.length; i++) { 
  8.  
  9.             var key = array[i]; 
  10.  
  11.             var j = i - 1; 
  12.  
  13.             while (j >= 0 && array[j] > key) { 
  14.  
  15.                 array[j + 1] = array[j]; 
  16.  
  17.                 j--; 
  18.  
  19.             } 
  20.  
  21.             array[j + 1] = key
  22.  
  23.         } 
  24.  
  25.         console.timeEnd('插入排序耗時(shí):'); 
  26.  
  27.         return array; 
  28.  
  29.     } else { 
  30.  
  31.         return 'array is not an Array!'
  32.  
  33.     } 
  34.  
  35.  

改進(jìn)插入排序: 查找插入位置時(shí)使用二分查找的方式

  1. function binaryInsertionSort(array) { 
  2.  
  3.     if (Object.prototype.toString.call(array).slice(8, -1) === 'Array') { 
  4.  
  5.         console.time('二分插入排序耗時(shí):'); 
  6.  
  7.         for (var i = 1; i < array.length; i++) { 
  8.  
  9.             var key = array[i], left = 0, right = i - 1; 
  10.  
  11.             while (left <= right) { 
  12.  
  13.                 var middle = parseInt((left + right) / 2); 
  14.  
  15.                 if (key < array[middle]) { 
  16.  
  17.                     right = middle - 1; 
  18.  
  19.                 } else { 
  20.  
  21.                     left = middle + 1; 
  22.  
  23.                 } 
  24.  
  25.             } 
  26.  
  27.             for (var j = i - 1; j >= left; j--) { 
  28.  
  29.                 array[j + 1] = array[j]; 
  30.  
  31.             } 
  32.  
  33.             array[left] = key
  34.  
  35.         } 
  36.  
  37.         console.timeEnd('二分插入排序耗時(shí):'); 
  38.  
  39.         return array; 
  40.  
  41.     } else { 
  42.  
  43.         return 'array is not an Array!'
  44.  
  45.     } 
  46.  
  47.  
  48. var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48]; 
  49.  
  50. console.log(binaryInsertionSort(arr));//[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]  

改進(jìn)前后對比:

 

插入排序動圖演示: 

 

(3)算法分析

  • ***情況:輸入數(shù)組按升序排列。T(n) = O(n)
  • 最壞情況:輸入數(shù)組按降序排列。T(n) = O(n2)
  • 平均情況:T(n) = O(n2)

4.希爾排序(Shell Sort)

1959年Shell發(fā)明;

***個(gè)突破O(n^2)的排序算法;是簡單插入排序的改進(jìn)版;它與插入排序的不同之處在于,它會優(yōu)先比較距離較遠(yuǎn)的元素。希爾排序又叫縮小增量排序

(1)算法簡介

希爾排序的核心在于間隔序列的設(shè)定。既可以提前設(shè)定好間隔序列,也可以動態(tài)的定義間隔序列。動態(tài)定義間隔序列的算法是《算法(第4版》的合著者Robert Sedgewick提出的。

(2)算法描述和實(shí)現(xiàn)

先將整個(gè)待排序的記錄序列分割成為若干子序列分別進(jìn)行直接插入排序,具體算法描述:

  • <1>. 選擇一個(gè)增量序列t1,t2,…,tk,其中ti>tj,tk=1;
  • <2>.按增量序列個(gè)數(shù)k,對序列進(jìn)行k 趟排序;
  • <3>.每趟排序,根據(jù)對應(yīng)的增量ti,將待排序列分割成若干長度為m 的子序列,分別對各子表進(jìn)行直接插入排序。僅增量因子為1 時(shí),整個(gè)序列作為一個(gè)表來處理,表長度即為整個(gè)序列的長度。

Javascript代碼實(shí)現(xiàn):

  1. function shellSort(arr) { 
  2.  
  3.     var len = arr.length, 
  4.  
  5.         temp
  6.  
  7.         gap = 1; 
  8.  
  9.     console.time('希爾排序耗時(shí):'); 
  10.  
  11.     while(gap < len/5) {          //動態(tài)定義間隔序列 
  12.  
  13.         gap =gap*5+1; 
  14.  
  15.     } 
  16.  
  17.     for (gap; gap > 0; gap = Math.floor(gap/5)) { 
  18.  
  19.         for (var i = gap; i < len; i++) { 
  20.  
  21.             temp = arr[i]; 
  22.  
  23.             for (var j = i-gap; j >= 0 && arr[j] > temp; j-=gap) { 
  24.  
  25.                 arr[j+gap] = arr[j]; 
  26.  
  27.             } 
  28.  
  29.             arr[j+gap] = temp
  30.  
  31.         } 
  32.  
  33.     } 
  34.  
  35.     console.timeEnd('希爾排序耗時(shí):'); 
  36.  
  37.     return arr; 
  38.  
  39.  
  40. var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48]; 
  41.  
  42. console.log(shellSort(arr));//[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]  

希爾排序圖示(圖片來源網(wǎng)絡(luò)): 

 

(3)算法分析

  • ***情況:T(n) = O(nlog2 n)
  • 最壞情況:T(n) = O(nlog2 n)
  • 平均情況:T(n) =O(nlog n)

5.歸并排序(Merge Sort)

和選擇排序一樣,歸并排序的性能不受輸入數(shù)據(jù)的影響,但表現(xiàn)比選擇排序好的多,因?yàn)槭冀K都是O(n log n)的時(shí)間復(fù)雜度。代價(jià)是需要額外的內(nèi)存空間。

(1)算法簡介

歸并排序是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個(gè)非常典型的應(yīng)用。歸并排序是一種穩(wěn)定的排序方法。將已有序的子序列合并,得到完全有序的序列;即先使每個(gè)子序列有序,再使子序列段間有序。若將兩個(gè)有序表合并成一個(gè)有序表,稱為2-路歸并。

(2)算法描述和實(shí)現(xiàn)

具體算法描述如下:

  • <1>.把長度為n的輸入序列分成兩個(gè)長度為n/2的子序列;
  • <2>.對這兩個(gè)子序列分別采用歸并排序;
  • <3>.將兩個(gè)排序好的子序列合并成一個(gè)最終的排序序列。

Javscript代碼實(shí)現(xiàn):

  1. function mergeSort(arr) {  //采用自上而下的遞歸方法 
  2.  
  3.     var len = arr.length; 
  4.  
  5.     if(len < 2) { 
  6.  
  7.         return arr; 
  8.  
  9.     } 
  10.  
  11.     var middle = Math.floor(len / 2), 
  12.  
  13.         left = arr.slice(0, middle), 
  14.  
  15.         right = arr.slice(middle); 
  16.  
  17.     return merge(mergeSort(left), mergeSort(right)); 
  18.  
  19.  
  20. function merge(leftright
  21.  
  22.  
  23.     var result = []; 
  24.  
  25.     console.time('歸并排序耗時(shí)'); 
  26.  
  27.     while (left.length && right.length) { 
  28.  
  29.         if (left[0] <= right[0]) { 
  30.  
  31.             result.push(left.shift()); 
  32.  
  33.         } else { 
  34.  
  35.             result.push(right.shift()); 
  36.  
  37.         } 
  38.  
  39.     } 
  40.  
  41.     while (left.length) 
  42.  
  43.         result.push(left.shift()); 
  44.  
  45.     while (right.length) 
  46.  
  47.         result.push(right.shift()); 
  48.  
  49.     console.timeEnd('歸并排序耗時(shí)'); 
  50.  
  51.     return result; 
  52.  
  53.  
  54. var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48]; 
  55.  
  56. console.log(mergeSort(arr));  

歸并排序動圖演示:

 

(3)算法分析

  • ***情況:T(n) = O(n)
  • 最差情況:T(n) = O(nlogn)
  • 平均情況:T(n) = O(nlogn)

6.快速排序(Quick Sort)

快速排序的名字起的是簡單粗暴,因?yàn)橐宦牭竭@個(gè)名字你就知道它存在的意義,就是快,而且效率高! 它是處理大數(shù)據(jù)最快的排序算法之一了。

(1)算法簡介

快速排序的基本思想:通過一趟排序?qū)⒋庞涗浄指舫瑟?dú)立的兩部分,其中一部分記錄的關(guān)鍵字均比另一部分的關(guān)鍵字小,則可分別對這兩部分記錄繼續(xù)進(jìn)行排序,以達(dá)到整個(gè)序列有序。

(2)算法描述和實(shí)現(xiàn)

快速排序使用分治法來把一個(gè)串(list)分為兩個(gè)子串(sub-lists)。具體算法描述如下:

  • <1>.從數(shù)列中挑出一個(gè)元素,稱為 “基準(zhǔn)”(pivot);
  • <2>.重新排序數(shù)列,所有元素比基準(zhǔn)值小的擺放在基準(zhǔn)前面,所有元素比基準(zhǔn)值大的擺在基準(zhǔn)的后面(相同的數(shù)可以到任一邊)。在這個(gè)分區(qū)退出之后,該基準(zhǔn)就處于數(shù)列的中間位置。這個(gè)稱為分區(qū)(partition)操作;
  • <3>.遞歸地(recursive)把小于基準(zhǔn)值元素的子數(shù)列和大于基準(zhǔn)值元素的子數(shù)列排序。Javascript代碼實(shí)現(xiàn): 

 

快速排序動圖演示:

 

(3)算法分析

  • ***情況:T(n) = O(nlogn)
  • 最差情況:T(n) = O(n2)
  • 平均情況:T(n) = O(nlogn)

7.堆排序(Heap Sort)

堆排序可以說是一種利用堆的概念來排序的選擇排序。

(1)算法簡介

堆排序(Heapsort)是指利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種排序算法。堆積是一個(gè)近似完全二叉樹的結(jié)構(gòu),并同時(shí)滿足堆積的性質(zhì):即子結(jié)點(diǎn)的鍵值或索引總是小于(或者大于)它的父節(jié)點(diǎn)。

(2)算法描述和實(shí)現(xiàn)

具體算法描述如下:

  • <1>.將初始待排序關(guān)鍵字序列(R1,R2….Rn)構(gòu)建成大頂堆,此堆為初始的無序區(qū);
  • <2>.將堆頂元素R[1]與***一個(gè)元素R[n]交換,此時(shí)得到新的無序區(qū)(R1,R2,……Rn-1)和新的有序區(qū)(Rn),且滿足R[1,2…n-1]<=R[n];
  • <3>.由于交換后新的堆頂R[1]可能違反堆的性質(zhì),因此需要對當(dāng)前無序區(qū)(R1,R2,……Rn-1)調(diào)整為新堆,然后再次將R[1]與無序區(qū)***一個(gè)元素交換,得到新的無序區(qū)(R1,R2….Rn-2)和新的有序區(qū)(Rn-1,Rn)。不斷重復(fù)此過程直到有序區(qū)的元素個(gè)數(shù)為n-1,則整個(gè)排序過程完成。

Javascript代碼實(shí)現(xiàn):

 

堆排序動圖演示: 

 

(3)算法分析

  • ***情況:T(n) = O(nlogn)
  • 最差情況:T(n) = O(nlogn)
  • 平均情況:T(n) = O(nlogn)

8.計(jì)數(shù)排序(Counting Sort)

計(jì)數(shù)排序的核心在于將輸入的數(shù)據(jù)值轉(zhuǎn)化為鍵存儲在額外開辟的數(shù)組空間中。

作為一種線性時(shí)間復(fù)雜度的排序,計(jì)數(shù)排序要求輸入的數(shù)據(jù)必須是有確定范圍的整數(shù)。

(1)算法簡介

計(jì)數(shù)排序(Counting sort)是一種穩(wěn)定的排序算法。計(jì)數(shù)排序使用一個(gè)額外的數(shù)組C,其中第i個(gè)元素是待排序數(shù)組A中值等于i的元素的個(gè)數(shù)。然后根據(jù)數(shù)組C來將A中的元素排到正確的位置。它只能對整數(shù)進(jìn)行排序。

(2)算法描述和實(shí)現(xiàn)

具體算法描述如下:

  • <1>. 找出待排序的數(shù)組中***和最小的元素;
  • <2>. 統(tǒng)計(jì)數(shù)組中每個(gè)值為i的元素出現(xiàn)的次數(shù),存入數(shù)組C的第i項(xiàng);
  • <3>. 對所有的計(jì)數(shù)累加(從C中的***個(gè)元素開始,每一項(xiàng)和前一項(xiàng)相加);
  • <4>. 反向填充目標(biāo)數(shù)組:將每個(gè)元素i放在新數(shù)組的第C(i)項(xiàng),每放一個(gè)元素就將C(i)減去1。

Javascript代碼實(shí)現(xiàn):

 

JavaScript動圖演示:

 

(3)算法分析

當(dāng)輸入的元素是n 個(gè)0到k之間的整數(shù)時(shí),它的運(yùn)行時(shí)間是 O(n + k)。計(jì)數(shù)排序不是比較排序,排序的速度快于任何比較排序算法。由于用來計(jì)數(shù)的數(shù)組C的長度取決于待排序數(shù)組中數(shù)據(jù)的范圍(等于待排序數(shù)組的***值與最小值的差加上1),這使得計(jì)數(shù)排序?qū)τ跀?shù)據(jù)范圍很大的數(shù)組,需要大量時(shí)間和內(nèi)存。

  • ***情況:T(n) = O(n+k)
  • 最差情況:T(n) = O(n+k)
  • 平均情況:T(n) = O(n+k)

9.桶排序(Bucket Sort)

桶排序是計(jì)數(shù)排序的升級版。它利用了函數(shù)的映射關(guān)系,高效與否的關(guān)鍵就在于這個(gè)映射函數(shù)的確定。

(1)算法簡介

桶排序 (Bucket sort)的工作的原理:假設(shè)輸入數(shù)據(jù)服從均勻分布,將數(shù)據(jù)分到有限數(shù)量的桶里,每個(gè)桶再分別排序(有可能再使用別的排序算法或是以遞歸方式繼續(xù)使用桶排序進(jìn)行排

(2)算法描述和實(shí)現(xiàn)

具體算法描述如下:

  • <1>.設(shè)置一個(gè)定量的數(shù)組當(dāng)作空桶;
  • <2>.遍歷輸入數(shù)據(jù),并且把數(shù)據(jù)一個(gè)一個(gè)放到對應(yīng)的桶里去;
  • <3>.對每個(gè)不是空的桶進(jìn)行排序;
  • <4>.從不是空的桶里把排好序的數(shù)據(jù)拼接起來。

Javascript代碼實(shí)現(xiàn):

 

桶排序圖示(圖片來源網(wǎng)絡(luò)):

 

(3)算法分析

桶排序***情況下使用線性時(shí)間O(n),桶排序的時(shí)間復(fù)雜度,取決與對各個(gè)桶之間數(shù)據(jù)進(jìn)行排序的時(shí)間復(fù)雜度,因?yàn)槠渌糠值臅r(shí)間復(fù)雜度都為O(n)。很顯然,桶劃分的越小,各個(gè)桶之間的數(shù)據(jù)越少,排序所用的時(shí)間也會越少。但相應(yīng)的空間消耗就會增大。

  • ***情況:T(n) = O(n+k)
  • 最差情況:T(n) = O(n+k)
  • 平均情況:T(n) = O(n2)

10.基數(shù)排序(Radix Sort)

基數(shù)排序也是非比較的排序算法,對每一位進(jìn)行排序,從***位開始排序,復(fù)雜度為O(kn),為數(shù)組長度,k為數(shù)組中的數(shù)的***的位數(shù);

(1)算法簡介

基數(shù)排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次類推,直到***位。有時(shí)候有些屬性是有優(yōu)先級順序的,先按低優(yōu)先級排序,再按高優(yōu)先級排序。***的次序就是高優(yōu)先級高的在前,高優(yōu)先級相同的低優(yōu)先級高的在前。基數(shù)排序基于分別排序,分別收集,所以是穩(wěn)定的。

(2)算法描述和實(shí)現(xiàn)

具體算法描述如下:

  • <1>.取得數(shù)組中的***數(shù),并取得位數(shù);
  • <2>.arr為原始數(shù)組,從***位開始取每個(gè)位組成radix數(shù)組;
  • <3>.對radix進(jìn)行計(jì)數(shù)排序(利用計(jì)數(shù)排序適用于小范圍數(shù)的特點(diǎn));

Javascript代碼實(shí)現(xiàn):

 

基數(shù)排序LSD動圖演示:

 

(3)算法分析

  • ***情況:T(n) = O(n * k)
  • 最差情況:T(n) = O(n * k)
  • 平均情況:T(n) = O(n * k)

基數(shù)排序有兩種方法:

  • MSD 從高位開始進(jìn)行排序
  • LSD 從低位開始進(jìn)行排序

基數(shù)排序 vs 計(jì)數(shù)排序 vs 桶排序

這三種排序算法都利用了桶的概念,但對桶的使用方法上有明顯差異:

  1. 基數(shù)排序:根據(jù)鍵值的每位數(shù)字來分配桶
  2. 計(jì)數(shù)排序:每個(gè)桶只存儲單一鍵值
  3. 桶排序:每個(gè)桶存儲一定范圍的數(shù)值 

 

責(zé)任編輯:龐桂玉 來源: 前端大全
相關(guān)推薦

2021-10-31 07:38:37

排序算法代碼

2022-03-10 12:03:33

Python算法代碼

2018-11-14 09:40:05

排序算法Java編程語言

2019-08-28 11:08:51

排序算法Java

2021-11-08 15:12:48

排序算法面試

2016-01-29 11:00:55

數(shù)據(jù)挖掘算法大數(shù)據(jù)

2013-02-25 09:46:35

數(shù)據(jù)挖掘算法ICDM

2011-01-26 09:14:43

數(shù)據(jù)挖掘

2021-01-26 05:33:07

排序算法快速

2021-01-21 05:22:36

排序算法選擇

2010-08-31 14:01:48

CSS

2018-10-27 15:47:35

CART算法決策樹

2024-09-06 17:57:35

2013-07-09 13:56:48

微信

2011-05-17 13:39:01

算法

2011-03-10 10:45:05

算法

2018-02-01 18:45:12

機(jī)器學(xué)習(xí)算法線性回歸

2018-09-13 12:51:58

數(shù)據(jù)挖掘算法樸素貝葉斯

2015-11-11 08:36:40

數(shù)據(jù)中心網(wǎng)絡(luò)運(yùn)維

2011-11-28 14:23:53

美信云網(wǎng)管
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

波多野结衣 在线| 欧美精品亚洲精品| 91高清免费看| 在线播放一区二区精品视频| 亚洲主播在线播放| 欧美久久在线| 国产精品主播一区二区| 在线精品福利| 一区二区成人av| 久久精品无码一区二区三区毛片| 激情影院在线| 久久精品一区二区三区不卡牛牛| 成人h视频在线| 中日韩精品视频在线观看| 成人三级视频| 亚洲精品一区二区二区| 日韩欧美大片| 国产午夜一区| 色婷婷久久一区二区三区麻豆| 欧美一进一出视频| 性少妇videosexfreexxx片| 99精品国产福利在线观看免费 | 天天影视色综合| 看女生喷水的网站在线观看| 不卡视频一二三四| 国产日韩精品入口| www.av麻豆| 婷婷久久国产对白刺激五月99| 日韩精品第一区| 欧美网站大全在线观看| 日本中文字幕在线视频观看| www免费网站在线观看| 成人a免费在线看| 国产女人精品视频| 日韩精品一区二区在线播放| 亚洲国产日韩欧美在线| 亚洲人成人99网站| 日本丰满少妇裸体自慰| 日韩精品视频中文字幕| 欧美久久一二区| 国产福利一区视频| 中文在线а√在线8| 亚洲一区二区四区蜜桃| 人人妻人人澡人人爽精品欧美一区| 四虎精品一区二区三区| 国产一区二区在线电影| 国产精品偷伦视频免费观看国产| 日韩和一区二区| 好看不卡的中文字幕| 精品国偷自产在线视频| 无码人中文字幕| 精品毛片免费观看| 亚洲视频在线视频| 91网站免费入口| 亚洲警察之高压线| 亚洲欧洲自拍偷拍| xxxxx在线观看| 国产成人精品免费视| 亚洲欧美日韩国产中文专区| 欧美性xxxx图片| 欧美一级色片| 亚洲免费成人av电影| 在线免费观看麻豆| 精品一区二区三| 这里只有精品在线播放| 久久久久久久毛片| 精品香蕉视频| 久久综合免费视频影院| 暗呦丨小u女国产精品| 一区二区三区在线电影| 最近日韩中文字幕中文| 一区二区三区四区五区| 午夜久久福利| 7m第一福利500精品视频| 日韩免费在线视频观看| 午夜一级久久| 国产精品久久77777| 岳乳丰满一区二区三区| 国产美女视频一区| 成人在线观看91| 少妇喷水在线观看| 久久久久青草大香线综合精品| 日韩精品不卡| av毛片在线免费看| 青青草成人影院| 日本在线不卡一区| 国产精品露脸自拍| 一道本无吗一区| 国产在线视频不卡二| 2014亚洲精品| 天堂成人在线视频| 国产午夜精品久久久久久免费视| 亚洲人成影视在线观看| 手机在线免费观看av| 天天做天天摸天天爽国产一区| 黄在线观看网站| 亚洲三级电影| 日韩成人在线电影网| 国产尤物91| 日韩在线观看视频一区二区三区| 91香蕉国产在线观看软件| 日韩免费电影一区二区| 老司机福利在线视频| 偷拍日韩校园综合在线| www.日本一区| 国产精品15p| 亚洲色图美腿丝袜| 国产67194| 亚洲深夜av| 91精品视频网站| 水中色av综合| 亚洲欧洲国产日本综合| 波多野结衣之无限发射| 亚洲一区二区三区久久久| 欧美精品一区二区三区四区| 久久久久亚洲AV成人无在| 国产一区亚洲| 国产精品精品久久久久久| 精品国产乱码久久久久久郑州公司 | 国产又大又黄又粗又爽| 网站一区二区| 中文字幕亚洲综合久久| 日韩 欧美 综合| 国产在线看一区| 日韩三级电影网站| 中文字幕乱码中文乱码51精品| 欧美一区二区三区的| 卡一卡二卡三在线观看| 国产精品嫩草99av在线| av免费精品一区二区三区| 日本在线观看视频| 91国在线观看| 欧美做受喷浆在线观看| 国内精品99| 亚洲影院在线看| 欧美r级在线| 欧美无人高清视频在线观看| 少妇真人直播免费视频| 一区二区三区国产盗摄| 国产欧美日韩视频一区二区三区| 污污网站在线观看| 51精品国自产在线| 女人18毛片毛片毛片毛片区二| 日韩成人精品在线观看| 欧美日韩综合精品| 9i看片成人免费高清| 日韩精品视频在线| 久久久久久久黄色片| 成人黄色一级视频| 国产婷婷一区二区三区| jizz性欧美23| 久久久噜噜噜久久中文字免| 丰满少妇一级片| 亚洲一区国产视频| 又黄又爽的网站| 亚洲三级色网| 久久精品丝袜高跟鞋| 悠悠资源网亚洲青| 精品视频在线播放免| 国产又大又黄又粗| 国产亚洲精品bt天堂精选| 黑人粗进入欧美aaaaa| 精品国产乱码久久久久久果冻传媒| 国产精品高潮在线| 99青草视频在线播放视| 欧美丰满美乳xxx高潮www| 搜索黄色一级片| 粉嫩一区二区三区在线看| 男女私大尺度视频| 亚洲日本三级| 国产精品一区二区久久久| 午夜在线视频| 日韩欧美成人一区二区| 日韩在线视频免费播放| 国产丝袜美腿一区二区三区| 波多野结衣xxxx| 欧美视频亚洲视频| 欧美精品七区| 国产精品美女久久久久人| 欧美激情二区三区| 麻豆国产在线播放| 欧美日韩第一区日日骚| 欧美片一区二区| 久久综合色之久久综合| 亚洲成人福利在线| 黄色一区二区三区四区| 欧美成人免费在线| **精品中文字幕一区二区三区| 欧美激情精品久久久久| 九九热视频在线观看| 91麻豆精品国产91久久久资源速度| 久草视频手机在线观看| 久久精子c满五个校花| 久久精品一卡二卡| 国产欧美91| av不卡在线免费观看| 欧美性生活一级片| 成人欧美一区二区三区在线 | 国产精品国产三级国产aⅴ浪潮| 黄网站在线免费看| 国产网站欧美日韩免费精品在线观看| 91麻豆成人精品国产| 婷婷六月综合亚洲| 青青操在线播放| 91在线播放网址| 人妻巨大乳一二三区| 首页国产欧美久久| 农民人伦一区二区三区| 婷婷综合伊人| 日本不卡二区高清三区| 91成人短视频| 成人免费自拍视频| 视频在线日韩| 欧美一级电影久久| 欧美xxxx做受欧美88bbw| 中文字幕亚洲欧美日韩2019| 五月婷婷免费视频| 日韩三级在线观看| 亚洲最大成人在线视频| 日本精品一区二区三区高清| 日韩激情一区二区三区| 亚洲欧洲日产国码二区| 五月天精品视频| av在线免费不卡| 黑人无套内谢中国美女| 精品一区二区三区视频在线观看| av片中文字幕| 国产日韩欧美一区在线| 草草视频在线免费观看| 欧美激情一级片一区二区| 一区二区精品免费视频| 欧洲美女日日| 日韩精品大片| 欧美日韩激情| 日韩av电影免费观看| 亚洲高清极品| 久久99精品久久久久久久青青日本 | 一区二区三区成人精品| 无码 制服 丝袜 国产 另类| 一区二区三区四区电影| 中文字幕第50页| 1024精品久久久久久久久| 一道精品一区二区三区| 日韩欧美高清在线播放| 在线观看成人av| 国产精品传媒精东影业在线| 一区二区三区四区不卡| 91中文字幕精品永久在线| 亚洲国产欧美一区二区三区不卡| 精品成人影院| 亚洲精品在线免费| 久久影视一区| 可以免费看的黄色网址| 黑丝一区二区三区| 日韩精品在线观看av| 激情综合网址| 大肉大捧一进一出好爽视频| 亚洲综合国产激情另类一区| 欧美a在线视频| 鲁大师成人一区二区三区| 妺妺窝人体色www在线观看| 日韩avvvv在线播放| 日本一二区免费| 国产麻豆精品在线观看| 亚洲一级Av无码毛片久久精品| 不卡区在线中文字幕| www.久久av| 国产精品无人区| 欧美成欧美va| 精品久久在线播放| 波多野结衣视频网址| 在线不卡的av| 免费观看黄色av| 亚洲精品有码在线| 免费在线观看av片| 久久久久成人精品| 伊人色综合一区二区三区影院视频 | 国产成+人+日韩+欧美+亚洲| 国产一级二级在线观看| 国产精品色哟哟| 久久久久久久久久久久国产| 欧美日韩亚洲系列| 国产一区二区自拍视频| 亚洲高清在线观看| 成年人在线观看| 九九热最新视频//这里只有精品| 麻豆理论在线观看| 国产男人精品视频| 精品资源在线| 亚洲一区在线免费| 亚洲精品1区2区| 超碰在线公开97| 成人av电影在线网| av在线播放中文字幕| 亚洲成人www| 一级片aaaa| 精品网站999www| 老司机在线看片网av| 国内揄拍国内精品| 99久久婷婷国产综合精品首页| 91啪国产在线| 国产影视一区| 福利视频一二区| 韩国女主播成人在线| 给我看免费高清在线观看| 亚洲婷婷综合色高清在线| 伊人手机在线视频| 日韩欧美成人午夜| 日本最黄一级片免费在线| 2024亚洲男人天堂| 亚洲一区电影| 亚洲一区二区四区| 久久中文精品| 亚洲 欧美 日韩在线| 最新成人av在线| 高潮毛片又色又爽免费 | 91午夜理伦私人影院| 亚洲色图美女| 青青青在线观看视频| 久久精品理论片| 新91视频在线观看| 五月婷婷激情综合| 亚洲精品久久久久久久久久| xxx一区二区| 蜜臀国产一区| 久草精品电影| 国产亚洲在线| 国产精品扒开腿做爽爽爽a片唱戏| 亚洲视频资源在线| 夜夜狠狠擅视频| 中文字幕日韩专区| 午夜精品久久久久久久久久蜜桃| 精品国产乱码久久久久久郑州公司 | 僵尸世界大战2 在线播放| 国产一区二区精品久久99| 日韩av片在线免费观看| 在线视频你懂得一区| 日本福利片高清在线观看| 91精品国产91久久久久久最新 | 亚洲精品一区二| 三级久久三级久久久| 欧美做受xxxxxⅹ性视频| 欧美日韩在线视频一区| 台湾av在线二三区观看| 91精品国产高清自在线| 精品淫伦v久久水蜜桃| jizzjizz国产精品喷水| 波多野洁衣一区| 日韩免费av片| 日韩精品视频在线观看网址| 欧美13videosex性极品| 欧美不卡在线一区二区三区| 麻豆亚洲精品| 一级黄色录像毛片| 欧美日韩在线一区二区| 麻豆视频在线| 91传媒免费看| 亚洲天堂偷拍| 亚洲av无码一区二区三区网址| 亚洲高清不卡在线观看| 三级视频在线看| 人体精品一二三区| 欧美日韩性在线观看| 亚洲最大成人在线观看| 亚洲欧美aⅴ...| 国产91麻豆视频| 热久久免费国产视频| 日本成人小视频| 青娱乐精品在线| 五月婷婷另类国产| 阿v免费在线观看| 91免费欧美精品| 日韩视频在线一区二区三区 | 在线看片不卡| 天堂www中文在线资源| 一本一道综合狠狠老| 亚洲s色大片| 高清视频在线观看一区| 亚洲在线一区| www.99re6| 亚洲成人黄色在线观看| 神马电影网我不卡| 欧美日韩视频免费在线观看| 成人av综合一区| 中文字幕在线观看1| 欧美高跟鞋交xxxxxhd| 自拍偷拍一区| 一本之道在线视频| 欧美午夜性色大片在线观看| 亚洲视频tv| 国产日韩欧美二区| 蜜臀av一区二区在线免费观看| 免费网站看av| 中文字幕欧美国内| 国产另类在线| 国产精品嫩草影院8vv8| 黑人极品videos精品欧美裸| 黄色在线论坛| 欧美三日本三级少妇三99| 国产宾馆实践打屁股91|