HTML5學堂-碼匠:本期繼續走入算法 —— 冒泡排序法。冒泡排序算法相對簡單,容易上手,穩定性也比較高, 算是一種較好理解的算法,也是面試官高頻提問的算法之一。html
Tips:關於「算法」及「排序」的基礎知識,在此前「選擇排序法」中已詳細講解,可點擊文後的相關文章連接查看,在此再也不贅述。面試
從序列頭部開始遍歷,兩兩比較,若是前者比後者大,則交換位置,直到最後將最大的數(本次排序最大的數)交換到無序序列的尾部,從而成爲有序序列的一部分;算法
下次遍歷時,此前每次遍歷後的最大數再也不參與排序;數組
屢次重複此操做,直到序列排序完成。性能
因爲在排序的過程當中老是小數往前放,大數日後放,相似於氣泡逐漸向上漂浮,因此稱做冒泡排序。優化
Tips:藍色表明在一輪排序中等待交換,黑色表明在該輪排序中已交換完成,紅色表明已排序完成網站
因爲待排序的序列只剩下一個數時已經可以肯定順序,則無需進行排序,所以,排序次數爲序列長度 – 1。3d
每次排序的比較次數控制htm
每次排序,序列中的多個數字要分別進行兩兩比較,屢次的比較須要利用for語句來進行實現。該for循環嵌套於排序次數的for循環當中(造成雙for的嵌套)。blog
Tips:j 須要設置爲小於 len - i - 1,減i的緣由是已經排序完成的數再也不參與比較,減1的緣由是數組下標索引值從0開始。
比較兩數大小,若是前者比後者大,則進行數值的交換,也就是交換位置。
假如序列的數據爲:[0, 1, 2, 3, 4, 5];
使用上面的冒泡排序法進行排序,獲得的結果確定沒有問題,可是,待排序的序列是有序的,理論上是無需遍歷排序。
當前的算法無論初始的序列是否有序,都會進行遍歷排序,效率會比較低,所以須要優化當前的排序算法。
在以下的算法中,引入一個swap變量,每一次排序以前初始化爲false;若發生兩數交換位置,則將其設置爲true。
在每次排序結束時候判斷swap是否爲false,若是是,則說明序列已排序完成或者序列自己是有序序列,就再也不進行下一次排序。
經過此方法,減小沒必要要的比較和位置交換,進一步提升算法的性能。
最佳狀態:待排序的序列自己是有序序列,排序次數根據優化後的代碼,能夠得出是n-1次,時間複雜度爲O(n);
最壞的狀況:待排序的序列是逆序的,此時須要排序1 + 2 +3 ……(n - 1) = n(n – 1 )/2次
時間複雜度爲O(n^2)。
冒泡排序法須要一個額外空間(temp變量)來交換元素的位置,因此空間複雜度爲O(1)。
當相鄰元素相等時,並不須要交換位置,也就不會出現相同元素的先後順序發生改變,因此,是穩定性排序。
時間複雜度,更準確的說該是描述一個算法在問題規模不斷增大時對應的時間增加曲線。因此,這些增加數量級並非一個準確的性能評價,能夠理解爲一個近似值。(空間複雜度同理)
O(n?)表示當n很大的時候,複雜度約等於Cn?,C是某個常數,簡單說就是當n足夠大的時候,隨着n的線性增加複雜度將沿平方增加。
O(n)表示,n很大的時候複雜度約等於Cn,C是某個常數。簡言之:隨着n的線性增加,複雜度沿線性級別增加。
O(1)表示,n很大的時候,複雜度基本就不增加了。簡言之:隨着n的線性增加,複雜度不受n的影響,沿常數級別增加(此處的常數是1)。
Tips:圖中O(1)緊貼着X軸,並看不太清楚。
Tips:該圖來源於「Stack Overflow」網站。
生活艱辛,代碼不易,但,不要忘記微笑!
版權聲明:該圖來自「【美】莉茲·克里莫 (author)」的書籍《你今天真好看》