氣泡排序是一種交換排序,實現比較簡單,其原始版本如下
void bubsort(int a, int n)
}}
而我們討論的重點是它的優化。
有序陣列:指按一定順序排列的陣列;
無序陣列:指不滿足一定排列順序的陣列;
對於氣泡排序,本文預設為前小後大排序方式,
也就是在排序過程中被運算元組的前面是無序的,後面逐漸變成有序,直到整個陣列有序。
插旗優化思路很簡單明瞭,就是在資料排序完成後插個旗,表明資料是否已經有序,進而避免多餘的迴圈。例如有陣列12354
顯然,第二次的時候就可以結束迴圈了。
void bubsort(int a, int n)
if (flag==0)//判斷有無旗子
break;//終止迴圈
}}
排序的時候,發生陣列無序但陣列後半部分有序的情況,這時後面有序部分可封起來,作為下一輪迴圈的頂,否則每次迴圈會多浪費時間去掃瞄這些有序部分。例如
陣列32145.
一 3 2 1 4 5
二 2 1 3 4 5
三 1 2 3 4 5
四 1 2 3 4 5
顯然,45重複掃瞄了多次。
void bubsort(int a, int n)
last = p;//封頂。
}}
# 優化三
對於雙向冒泡的原理也容易理解,就是同時從兩邊對陣列進行掃瞄和交換,一次找出最大值和最小值。
void bubsort(int a, int n)
hi = top;//封頂
for (int j=hi; j>lo; j--)//從後到前掃瞄
if (a[hi]等等,分析一下時間複雜度,雖然雙向冒泡的外部迴圈少了執行次數,但內部變成兩次迴圈,和單向冒泡都是o(n^2),到底在什麼地方優化呢?
我們再看看我做的簡單的對照表
column 1
column 2
0.219
26.246
0.19
21.106
0.16
18.413
依次為單向冒泡,單向冒泡(插旗+封頂),雙向冒泡在陣列大小分別為10000,100000時執行的時間。
注:**時間均為三次執行的中值,使用rand(),資料從實驗方面來說不嚴謹,但這裡只為說明雙向冒泡確實做到了優化。
為什麼雙向能做到優化呢?
很簡單雙向氣泡排序自帶了封頂優化(封底從另一方面也可以看作封頂)。也就是說雙向的優化和封頂優化的原理相同,甚至雙向不僅封頂,而且還封底,比單向封頂還要好一點。
相信看到題目,大家馬上就能想到原理,這裡就不贅述了。
void
bubsort
(int a,
int n)
hi = top;
if(flag==0)
break
; flag =0;
for(
int j=hi; j>lo; j--)if
(a[j]
) lo = top;
if(flag==0)
break
; flag =0;
}}
這就是氣泡排序最終優化版本(雙向插旗)了。
————————————————
注意!原版氣泡排序的時間是穩定的,但我們所做的優化是對資料有點敏感的,所以優化後的版本雖然時間複雜度還是o(n^2),但如果用測試的時候,執行時長會隨著資料的變化而變化。
我的個人hexo部落格.
氣泡排序 氣泡排序演算法優化
常用的排序演算法主要包括 1 插入排序 直接插入排序 希爾排序 2 交換排序 氣泡排序 快速排序 3 選擇排序 簡單選擇排序 堆排序快速排序 4 歸併排序其中,氣泡排序算是最簡單的一種排序演算法 public class bubble int temp 0 for int i 0 iarr j 1 ...
排序演算法 氣泡排序 優化
排序演算法在程式設計中起到非常大的作用,氣泡排序是其中比較經典的演算法。雖然效率不高,但是每個演算法都有適合的場景。氣泡排序就是在排序過程中相鄰元素不斷交換,看起來向元素冒泡一樣。那我們就可以通過新增乙個標誌位來對氣泡排序進行優化處理。因為,在某一次排序的過程中可能需要排序的陣列已經是有序的了,在這...
C 氣泡排序 氣泡排序的優化
本文包含氣泡排序的三種實現方式 分別為氣泡排序初級版,公升級版,終級版 自己起的名字 使用時只要使用終極版就本以了,終級版為公升級版的優化版本 至於初極版和公升級版只是為了幫助理解 氣泡排序的時間複雜度為o n include include include include include incl...