冒泡排序

冒泡排序就如他的名字,每次都有泡泡浮上來,泡泡自然是最輕的,最小的,一次遍歷數列侯最小的會交換到第一位(下標爲1,下標0爲哨兵位)。
 其實也可以相反的來,每次遍歷有最大的交換到最後一位,沉底法,就如石頭沉到底一樣。
我用的就是沉底。
用數組來舉例,先是外層循環,設置i從1到 len-1,每次i++,從1開始因爲0號下標爲哨兵我們不管。
至於爲什麼是len-1呢。因爲我們知道每次循環會有一個數上浮(或者下沉)到一個位置,當倒數第二個待排數到達指定位置後,最後一個待排數字的位置也就確定。
代碼




關於優化:
冒泡排序的優化是這樣的,每次內循環都是前後兩者比較,如果出現了反序的情況就交換,但如果一遍遍歷下來沒有反序發生呢,那就代表數列已經有序了,所以我們可以加個標緻flag,初始爲false;如果有反序發生,進入了交換那塊的代碼,我們就把flag變爲true,內循環結束後判斷下flag。如果爲true,那麼什麼也不做,直接下一次循環,如果依舊爲flase,就代表那次內循環從頭到尾都沒進入過交換代碼塊 ,整個數列不存在反序!那麼我們的目的就已經達到了,直接跳出外循環,結束函數,打完收工!!
優化代碼如下:


但是這種優化只對於那種基本有序的數列有用處,對於很亂序的數列來說幾乎沒什麼優化,還會增加邏輯判斷。
所以說不實用,但蒼蠅腿也是肉,吃不吃看需求了。
以下是不優化1萬個隨機數據和排序花費的時間:


以下是優化後1萬個隨機數據和排序花費的時間:


可以看出時間反而還多了,因爲其實兩次隨機數的排列都一樣的,但優化增加的邏輯判斷時間要比優化節省的時間還多,所以說有時蒼蠅腿也不能吃,萬一髒了感染病也是問題。
最後試了試10萬個隨機數據:



漫長的81秒啊,可以看出冒泡的時間複雜度是很差的。


平均爲0(n^2)  最好爲O(n) 最壞(n^2)

穩定性:是穩定的,因爲沒有發生過跳躍式的位置交換,大家都很按照規則的前後比,如果一樣也不會亂插隊,真好!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章