氣泡排序是一種交換排序,它的基本思路是:
兩兩比較相鄰記錄的關鍵字,如果反序則交換,知道沒有反序的記錄位置。依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟:首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。至此第一趟結束,將最大的數放到了最後。在第二趟:仍從第一對數開始比較(因為可能由於第2個數和第3個數的交換,使得第1個數不再小於第2個數),將小數放前,大數放後,一直比較到倒數第二個數(倒數第一的位置上已經是最大的),第二趟結束,在倒數第二的位置上得到乙個新的最大數(其實在整個數列中是第二大的數)。如此下去,重複以上過程,直至最終完成排序。
最簡單排序實現
public
void
bubblesort_0
(int
elem)}}
}
先看這段**,這段**嚴格上上並不是標準的氣泡排序演算法,因為不滿足"兩兩比較相鄰記錄"的思想,它的思路就是讓每乙個關鍵字都和它後面的每乙個關鍵字比較,如果大則交換,這樣第一位置的關鍵字在一次迴圈後一定變成最小值。比如待排序的序列是,當i=1時,9與1交換後,在第一位置的1與後面的關鍵字比較都小,因此它為最小值。當i=2時,第二位置先後由9換成5,換成3,換成2,完成第二小的數字交換,依次執行,知道最後。
這段**簡單易懂,但是存在很大的缺陷,當排序好1和2位置後,對其餘關鍵字的排序沒幫助(比如數字3反而被換到最後的位置),所以效率非常低
氣泡排序實現
//置換
public
void
swap
(int
elem,
int i,
int j)
//冒泡
public
void
bubblesort
(int
elem)}}
}
當i=2時,變數j由8反向迴圈到2,逐個比較,在將關鍵字2交換到第二位置的同時,也將關鍵字4和3也有所提公升,與第一種相比,在資料量很大的情況下差異會體現出來。
氣泡排序複雜度分析
最好情況下,也就是待排序的表是有序的,會執行n-1次比較,沒有資料置換,時間複雜度為o(n);
最壞情況下,即待排序的表是逆序的,需要執行n(n
−1)2
\frac
2n(n−1
)次,並做等量級的記錄移動,時間複雜度為o(n
2n^2
n2)。氣泡排序的優化
氣泡排序存在不足和可優化的地方:
在排序過程中,執行完最後的排序後,雖然資料已全部排序完備,但程式無法判斷是否完成排序,為了解決這一不足,可設定乙個標誌位flag,將其初始值設定為true,表示被排序的表是乙個無序的表,每一次排序開始前設定flag值為false,在進行資料交換時,修改flag為true。在新一輪排序開始時,檢查此標誌,若此標誌為false,表示上一次沒有做過交換資料,則結束排序;否則進行排序;
public
void
bubblesort_2
(int
elem)}}
}
區域性冒泡
在氣泡排序中,一趟掃瞄有可能無資料交換,也有可能有一次或多次資料交換,在傳統的氣泡排序演算法及近年來的一些改進的演算法中,只記錄一趟掃瞄有無資料交換的資訊,對資料交換發生的位置資訊則不予處理。為了充分利用這一資訊,可以在一趟全域性掃瞄中,對每一反序資料對進行區域性氣泡排序處理,稱之為區域性氣泡排序。區域性氣泡排序與氣泡排序演算法具有相同的時間複雜度,並且在正序和逆序的情況下,所需的關鍵字的比較次數和移動次數完全相同。由於區域性氣泡排序和氣泡排序的資料移動次數總是相同的,而區域性氣泡排序所需關鍵字的比較次數常少於氣泡排序,這意味著區域性氣泡排序很可能在平均比較次數上對氣泡排序有所改進,當比較次數較少的優點不足以抵消其程式複雜度所帶來的額外開銷,而當資料量較大時,區域性氣泡排序的時間效能則明顯優於氣泡排序。對於n個無序資料,我們在進行一趟氣泡排序時,如果第k個資料和第k+1個資料逆序,那麼對第k+1個資料進行一趟向前的氣泡排序,使其移動到合適的位置,也就是說讓前面k+1個資料調節為正序。因為這種冒泡法只對前k+1個資料冒泡處理,所以我們稱它為——區域性冒泡
氣泡排序java實現
基本思想 將待排序的n個元素垂直排成一列,依次比較上下相鄰的兩個元素,如果上面的數大於下面的,則兩者交換,第一趟氣泡排序的結果使得關鍵字最大的記錄被放在最後乙個位置上,然後第二趟起泡排序對前n 1個記錄進行同樣操作,結果是關鍵字次大的記錄被安放在第n 1個位置上,以此類推共進行n 1趟排序。特點 穩...
java實現氣泡排序
前面實現了快速排序演算法,其實這個算是難點的,如果是無序打亂的,用快速排序比較好。氣泡排序是從我們剛接觸程式設計到找工作面試經常能遇見到的,雖然它的效率並不高,但是很重要,不知道你忘記怎麼實現了沒有?首先看一下氣泡排序的例項圖 氣泡排序的過程很簡單,就是將第乙個記錄的關鍵字和第二個記錄的關鍵字進行比...
java實現氣泡排序
昨晚又開始研究八大排序演算法了,上一次還是過年的時候,這麼久了不用,又忘了,以此記錄。氣泡排序 就是每一次冒泡都把最大的放在最右邊 或者把最小的放在最右邊 package suanfa public class bubblesort if issort break 完成後直接跳出for i的迴圈 p...