在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ HTML/ 淺談 javascript 實現(xiàn)八大排序
淺談 JavaScript 之事件綁定
淺談 javascript 中字符串 String 與數(shù)組 Array
淺談 javascript 中基本包裝類型
淺談 JavaScript Math 和 Number 對象
淺談 Javascript 的靜態(tài)屬性和原型屬性
淺談 JavaScript 中定義變量時有無 var 聲明的區(qū)別
淺談 JavaScript Array 對象
淺談 JavaScript 函數(shù)參數(shù)的可修改性問題
淺談 javascript 中的 instanceof 和 typeof
淺談 JavaScript 中 Date (日期對象),Math 對象
淺談 Javascript 執(zhí)行順序
淺談 javascript 函數(shù)屬性和方法
淺談 JavaScript 中面向?qū)ο蠹夹g(shù)的模擬
淺談 javascript 的原型繼承
淺談 javascript 事件取消和阻止冒泡
根據(jù)一段代碼淺談 Javascript 閉包
淺談 Javascript 面向?qū)ο缶幊?/span>
淺談 javascript 六種數(shù)據(jù)類型以及特殊注意點
淺談 Javascript 變量作用域問題
淺談 javascript 函數(shù)內(nèi)部屬性
淺談 javascript 中自定義模版
淺談 JavaScript 字符集
淺談 javascript 面向?qū)ο缶幊?/span>
淺談 JavaScript 框架分類
淺談 JavaScript 中的 Math.atan() 方法的使用
淺談 Javascript 數(shù)組與字典
淺談 JavaScript 數(shù)據(jù)類型及轉(zhuǎn)換
淺談 javascript 的調(diào)試
淺談 Javascript 嵌套函數(shù)及閉包
淺談 javascript 回調(diào)函數(shù)
淺談 JavaScript Date 日期和時間對象
淺談 Javascript 中的 Function 與 Object
淺談 JavaScript 數(shù)據(jù)類型
淺談 javascript 中 this 在事件中的應(yīng)用
淺談 javascript 中的閉包
淺談 javascript 函數(shù)劫持
淺談 Javascript 中深復(fù)制
淺談 JavaScript 函數(shù)節(jié)流
淺談 JavaScript 中的 String 對象常用方法
淺談 JavaScript 事件的屬性列表
淺談 JavaScript 函數(shù)與棧
淺談 JavaScript 的事件
淺談 javascript 中的作用域
淺談 JavaScript 的執(zhí)行效率
淺談 Javascript 事件模擬
淺談 JavaScript function 函數(shù)種類
淺談 javascript 歸并方法
淺談 javascript 迭代方法
淺談 JavaScript 編程語言的編碼規(guī)范
淺談 JavaScript 實現(xiàn)面向?qū)ο笾械念?/span>
淺談 Javascript 鼠標(biāo)和滾輪事件
淺談 Javascript Base64 加密解密
淺談 Javascript 中勻速運動的停止條件
淺談 javascript 實現(xiàn)八大排序
淺談 javascript 的分號的使用
淺談 javascript 中 createElement 事件
淺談 javascript 的數(shù)據(jù)類型檢測
淺談 javascript 對象模型和 function 對象
淺談 Javascript 如何實現(xiàn)勻速運動
淺談 JavaScript 字符串與數(shù)組
淺談 javascript 面向?qū)ο蟪绦蛟O(shè)計
淺談 Javascript 事件處理程序的幾種方式

淺談 javascript 實現(xiàn)八大排序

開學(xué)一個月,已經(jīng)多次夢見筆試出現(xiàn)數(shù)據(jù)結(jié)構(gòu)算法題,我對數(shù)據(jù)結(jié)構(gòu)的恐懼已經(jīng)多于任何“妖魔鬼怪”了。呵呵,看來真的很有必要復(fù)習(xí)一下常用的數(shù)據(jù)結(jié)構(gòu),免得“噩夢”成真。

數(shù)據(jù)機構(gòu)等編程基礎(chǔ)的重要性不用多說,直接進(jìn)入正題。

排序算法,分為內(nèi)部排序和外部排序。內(nèi)部排序要使用內(nèi)存,這里只探討內(nèi)部排序。

  1. 入排序:直接插入排序和希爾排序

  2. 選擇排序:簡單選擇排序和堆排序

  3. 交換排序:冒泡排序和快速排序

  4. 歸并排序

  5. 基數(shù)排序

http://wiki.jikexueyuan.com/project/brief-talk-js/images/109.png" alt="" />

直接插入排序

基本思想:在要排序的一組數(shù),假設(shè)前面(n-1)[n>=2]個數(shù)已經(jīng)是排好順序的,先要把第 n 個數(shù)插入到前面的有序數(shù),使得這 n 個數(shù)也是排好順序的。如此反復(fù)循環(huán),知道全部排好順序。

希爾排序

基本思想:算法先將要排序的一組數(shù)按某個增量 d(n/2,n為要排序的個數(shù))分成若干組,每組中記錄的下標(biāo)相差 d。對每組中全部元素進(jìn)行直接插入排序,然后再用一個較小的增量(d/2)對它進(jìn)行分組,在每組中再進(jìn)行直接插入排序。當(dāng)增量減到1時,進(jìn)行直接插入排序后,排序完成。

簡單選擇排序

基本思想:在要排序的一組數(shù)中,選出最小的一個數(shù)與第一個位置的數(shù)交換,然后剩下的數(shù)當(dāng)中找出最小的與第二個位置的數(shù)交換,如此尋哈 un 到倒數(shù)第二個數(shù)和最后一個數(shù)為止。

堆排序

基本思想:堆排序是一種樹形選擇排序,是對直接選擇排序的有效改進(jìn)。

具有 n 個元素的序列(h1,h2,...,hn),當(dāng)且僅當(dāng)滿足(hi>=h2i,hi>=2i+1)或(hi<=h2i,hi<=2i+1)(i=1,2,...,n/2)時稱之為堆。在這里只討論滿足前者條件的堆。由堆的定義可以看出,堆頂元素(即第一個元素)必為最大項(大頂堆)。完全二叉樹可以很直觀地表示堆的結(jié)構(gòu)。堆頂為根,其它為左子樹、右子樹。初始時把要排序的數(shù)的序列看作是一棵順序存儲的二叉樹,調(diào)整它們的存儲序,使之成為一個堆,這時堆的根節(jié)點的數(shù)最大。然后將根節(jié)點與堆的最后一個節(jié)點交換。然后對前面(n-1)個數(shù)重新調(diào)整使之成為堆。依此類推,直到只有兩個節(jié)點的堆,并對它們作交換,最后得到有n個節(jié)點的有序序列。從算法描述來看,堆排序需要兩個過程,一是建立堆,二是堆頂與堆的最后一個元素交換位置。所以堆排序有兩個函數(shù)組成。一是建堆的滲透函數(shù),二是反復(fù)調(diào)用滲透函數(shù)實現(xiàn)排序的函數(shù)。

冒泡排序

基本思想:在要排序的一組數(shù)中,對當(dāng)前還未排好序的范圍內(nèi)的全部數(shù),自上而下對相鄰的兩個數(shù)依次進(jìn)行比較和調(diào)整,讓較大的數(shù)往下沉,較小的往上冒。即:每當(dāng)兩相鄰的數(shù)比較后發(fā)現(xiàn)它們的排序與排序要求相反時,就將它們互換。

快速排序

基本思想:選擇一個基準(zhǔn)元素,通常選擇第一個元素或者最后一個元素,通過一趟掃描,將待排序列分成兩部分,一部分比基準(zhǔn)元素小,一部分大于等于基準(zhǔn)元素,此時基準(zhǔn)元素在其排好序后的正確位置,然后再用同樣的方法遞歸地排序劃分的兩部分。

歸并排序

基本排序:歸并(Merge)排序法是將兩個(或兩個以上)有序表合并成一個新的有序表,即把待排序序列分為若干個子序列,每個子序列是有序的。然后再把有序子序列合并為整體有序序列。

基數(shù)排序

基本思想:將所有待比較數(shù)值(正整數(shù))統(tǒng)一為同樣的數(shù)位長度,數(shù)位較短的數(shù)前面補零。然后,從最低位開始,依次進(jìn)行一次排序。這樣從最低位排序一直到最高位排序完成以后,數(shù)列就變成一個有序序列。

http://wiki.jikexueyuan.com/project/brief-talk-js/images/111.png" alt="" />

代碼演示地址:http://lovermap.sinaapp.com/test/sort.html

現(xiàn)在我們分析一下8種排序算法的穩(wěn)定性。

(請網(wǎng)友結(jié)合前面的排序基本思想來理解排序的穩(wěn)定性(8種排序的基本思想已經(jīng)在前面說過,這里不再贅述)不然可能有些模糊)

(1)直接插入排序:一般插入排序,比較是從有序序列的最后一個元素開始,如果比它大則直接插入在其后面,否則一直往前比。如果找到一個和插入元素相等的,那么就插入到這個相等元素的后面。插入排序是穩(wěn)定的。

(2)希爾排序:希爾排序是按照不同步長對元素進(jìn)行插入排序,一次插入排序是穩(wěn)定的,不會改變相同元素的相對順序,但在不同的插入排序過程中,相同的元素可能在各自的插入排序中移動,穩(wěn)定性就會被破壞,所以希爾排序不穩(wěn)定。

(3)簡單選擇排序:在一趟選擇,如果當(dāng)前元素比一個元素小,而該小的元素又出現(xiàn)在一個和當(dāng)前元素相等的元素后面,那么交換后穩(wěn)定性就被破壞了。光說可能有點模糊,來看個小實例:858410,第一遍掃描,第1個元素8會和4交換,那么原序列中2個8的相對前后順序和原序列不一致了,所以選擇排序不穩(wěn)定。

(4)堆排序:堆排序的過程是從第 n/2 開始和其子節(jié)點共3個值選擇最大(大頂堆)或者最小(小頂堆),這3個元素之間的選擇當(dāng)然不會破壞穩(wěn)定性。但當(dāng)為 n/2-1, n/2-2, ...這些父節(jié)點選擇元素時,有可能第 n/2 個父節(jié)點交換把后面一個元素交換過去了,而第 n/2-1 個父節(jié)點把后面一個相同的元素沒有交換,所以堆排序并不穩(wěn)定。

(5)冒泡排序:由前面的內(nèi)容可知,冒泡排序是相鄰的兩個元素比較,交換也發(fā)生在這兩個元素之間,如果兩個元素相等,不用交換。所以冒泡排序穩(wěn)定。

(6)快速排序:在中樞元素和序列中一個元素交換的時候,很有可能把前面的元素的穩(wěn)定性打亂。還是看一個小實例:6 4 4 5 4 7 8 9,第一趟排序,中樞元素6和第三個4交換就會把元素4的原序列破壞,所以快速排序不穩(wěn)定。

(7)歸并排序:在分解的子列中,有1個或2個元素時,1個元素不會交換,2個元素如果大小相等也不會交換。在序列合并的過程中,如果兩個當(dāng)前元素相等時,我們把處在前面的序列的元素保存在結(jié)果序列的前面,所以,歸并排序也是穩(wěn)定的。

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

8種排序的分類,穩(wěn)定性,時間復(fù)雜度和空間復(fù)雜度總結(jié):

http://wiki.jikexueyuan.com/project/brief-talk-js/images/110.png" alt="" />

以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡。