html5學堂-碼匠:本期繼續走入演算法 —— 氣泡排序法。氣泡排序演算法相對簡單,容易上手,穩定性也比較高,從序列頭部開始遍歷,兩兩比較,如果前者比後者大,則交換位置,直到最後將最大的數(本次排序最大的數)交換到無序序列的尾部,從而成為有序序列的一部分;算是一種較好理解的演算法,也是面試官高頻提問的演算法之一。
下次遍歷時,此前每次遍歷後的最大數不再參與排序;
多次重複此操作,直到序列排序完成。
由於在排序的過程中總是小數往前放,大數往後放,類似於氣泡逐漸向上漂浮,所以稱作氣泡排序。
tips:藍色代表在一輪排序中等待交換,黑色代表在該輪排序中已交換完成,紅色代表已排序完成
由於待排序的序列只剩下乙個數時已經能夠確定順序,則無需進行排序,因此,排序次數為序列長度 – 1。
每次排序,序列中的多個數字要分別進行兩兩比較,多次的比較需要利用for語句來進行實現。該for迴圈巢狀於排序次數的for迴圈當中(形成雙for的巢狀)。
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)。
演算法之旅 | 選擇排序法
生活艱辛,**不易,但,不要忘記微笑!
演算法 氣泡排序法
氣泡排序就是把小的元素往前調或者把大的元素往後調 c語言 include define size 8 void bubble sort int a,int n void bubble sort int a,int n int main int i bubble sort number,size fo...
冒泡法排序演算法
演算法筆記 再回顧冒泡法排序 冒泡法是我們學習程式設計接觸到的第乙個排序演算法,簡單而形象,整個比對過程跟泉水冒泡十分形似。冒泡法排序首先拿第乙個元素與相鄰元素進行比較,如果它比較大,就相互交換,這樣第一輪遍歷下來,最大的值就確定了,第n輪也是如此,都是從第乙個開始,一直比較到倒數第n個,這樣最大的...
排序演算法 氣泡排序法
氣泡排序法 bubble sort 是所有排序演算法中最簡單,最基本的一種。氣泡排序法的基本思路就是交換排序,通過相鄰資料的比較來達到排序的目的。氣泡排序演算法通過多次比較和交換資料來實現排序,其排序流程如下 1 對陣列中的各元素依次比較相鄰元素的大小。2 如果前面的資料大於後面的資料,就交換這兩個...