氣泡排序(包括區域性氣泡排序)

2021-06-02 09:52:06 字數 3468 閱讀 7321

氣泡排序(bubblesort)的基本概念:依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟:首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。至此第一趟結束,將最大的數放到了最後。在第二趟:仍從第一對數開始比較(因為可能由於第2個數和第3個數的交換,使得第1個數不再小於第2個數),將小數放前,大數放後,一直比較到倒數第二個數(倒數第一的位置上已經是最大的),第二趟結束,在倒數第二的位置上得到乙個新的最大數(其實在整個數列中是第二大的數)。如此下去,重複以上過程,直至最終完成排序。

由於在排序過程中總是小數往前放,大數往後放,相當於氣泡往上公升,所以稱作氣泡排序。

用二重迴圈實現,外迴圈變數設為i,內迴圈變數設為j。外迴圈重複9次,內迴圈依次重複9,8,...,1次。每次進行比較的兩個元素都是與內迴圈j有關的,它們可以分別用a[j]和a[j+1]標識,i的值依次為1,2,...,9,對於每乙個i, j的值依次為1,2,...10-i。

氣泡排序使用場景:考慮資料已有順序,快排是一種不穩定的排序(當然可以改進),對於大部分排好的資料,快排會浪費大量不必要的步驟。資料量極小,而且已經基本排好序,冒泡是最佳選擇。我們說快排好,是指大量隨機資料下,快排效果最理想。而不是所有情況。

氣泡排序法:該演算法是專門針對已部分排序的資料進行排序的一種排序演算法。如果在你的資料清單中只有一兩個資料是亂序的話,用這種演算法就是最快的排序演算法。如果你的資料清單中的資料是隨機排列的,那麼這種方法就成了最慢的演算法了。因此在使用這種演算法之前一定要慎重。這種演算法的核心思想是掃瞄資料清單,尋找出現亂序的兩個相鄰的專案。當找到這兩個專案後,交換專案的位置然後繼續掃瞄。重複上面的操作直到所有的專案都按順序排好。

優點:

1.「程式設計複雜度」很低,很容易寫出**;

2.具有穩定性,這裡的穩定性是指原序列中相同元素的相對順序仍然保持到排序後的序列,而堆排序、快速排序均不具有穩定性。

時間複雜度: o(n2)。比較和交換的時間複雜度都是o(n^2),自適應,對於已基本排序的演算法,時間複雜度為o(n)。冒泡演算法的許多性質和插入演算法相似,但對於系統開銷高一點點。

額外的空間: o(1) 

氣泡排序的改進

第一,在排序過程中,執行完最後的排序後,雖然資料已全部排序完備,但程式無法判斷是否完成排序,為了解決這一不足,可設定乙個標誌單元flag,將其設定為off,表示被排序的表示是乙個無序的表。在每一排序開始時,檢查此標誌,若此標誌為0,則結束排序;否則進行排序;

第二,當排序的資料比較多時排序的時間會明顯延長。改進方法:快速排序

:具體做法:任意選取某一記錄(通常取第乙個記錄),比較其關鍵字與所有記錄的關鍵字,並將關鍵字比它小的記錄全部放在它的前面,將比它大的記錄均存放在它的後面,這樣,經過一次排序之後,可將所有記錄以該記錄所在的分界點分為兩部分,然後分別對這兩部分進行快速排序,直至排序完。

區域性氣泡排序演算法對氣泡排序的改進:

在氣泡排序中,一趟掃瞄有可能無資料交換,也有可能有一次或多次資料交換,在傳統的氣泡排序演算法及近年來的一些改進的演算法中,只記錄一趟掃瞄有無資料交換的資訊,對資料交換發生的位置資訊則不予處理。為了充分利用這一資訊,可以在一趟全域性掃瞄中,對每一反序資料對進行區域性氣泡排序處理,稱之為區域性氣泡排序。區域性氣泡排序與氣泡排序演算法具有相同的時間複雜度,並且在正序和逆序的情況下,所需的關鍵字的比較次數和移動次數完全相同。由於區域性氣泡排序和氣泡排序的資料移動次數總是相同的,而區域性氣泡排序所需關鍵字的比較次數常少於氣泡排序,這意味著區域性氣泡排序很可能在平均比較次數上對氣泡排序有所改進,但比較次數較少的優點不足以抵消其程式複雜度所帶來的額外開銷,而當資料量較大時,區域性氣泡排序的時間效能則明顯優於氣泡排序(結合改進氣泡排序設定標誌量的方法最好)。

例項**說明:

1、原始氣泡排序

packagecom.test.sort;

// 氣泡排序

public classbubblesort // end if

}// end for

system.out.println("\n排序中:");

for (comparable data1 : data) // end for

}// end sort

public static void main(string args) ;

system.out.println("\n排序前:");

for (comparable data : c) // end if

}// end for

// 本趟排序未發生交換,提前終止演算法,提高效率

if (!i***changed) // end if

system.out.println("\n排序中:");

for (comparable data1 : data) // end for

}// end sort

public static void main(string args) ;

system.out.println("\n排序前:");

for (comparable data : c) // end if

// 將比較前面兩個數是否存在需要排序的情況

if (i***changed) // end for

// 本趟排序未發生交換,提前終止演算法,提高效率

if (!i***changed) // end if

system.out.println("\n排序中:");

for (comparable data1 : data) // end for

}// end sort

public static void main(string args) ;

comparable c = ;

system.out.println("\n排序前:");

for (comparable data : c) {

system.out.print(data +"\t");

sort(c);

system.out.println("\n排序後:");

for (comparable data : c) {

system.out.print(data +"\t");

排序前:

1    2    1    7    5    4    5    9    23   45   27  

排序中:

1    1    2    4    5    7    5    9    23   27   45  

排序中:

1    1    2    4    5    5    7    9    23   27   45  

排序後:

1    1    2    4    5    5    7    9    23   27   45   

排序 區域性氣泡排序

什麼是氣泡排序 為了更清楚地說明區域性冒泡 對於一組無序資料,兩兩相鄰比較,若反序則交換,直到沒有反序為止。比如有n個資料,我們需要進行k 0 趟氣泡排序 最好的情況是正序,我們只需要進行 1趟氣泡排序,最壞的情況是逆序,我們需要進行 n 1趟氣泡排序。什麼是區域性冒泡 對於n個無序資料,我們在進行...

氣泡排序 排序 氣泡排序

既然寫了計組思來想去便打算把資料結構也寫下來,寫的時候總是發現看的時候無法發現的問題,受益良多。交換排序的基本思想 exchange until sorted 順序,分支,迴圈 注意偽 的熟悉 下面介紹兩種交換演算法 首先進行聯想,用乙個圖進行輔助聯想 水冒泡過程 頂部是陣列的begin,底部理解為...

氣泡排序 氣泡排序法

冒泡法是一種簡單的排序方法,它的實現非常簡單。首先對n個專案進行掃瞄,比較相領兩個專案的大小,若發現違背大小次序則進行互換,由此可以使n個專案中的最大者換到最後。然後對剩下的未排序好的專案再進行掃瞄,使它們的最大者換到表的最後。以此類推,直到將表全部排序好為止。這種排序方法,每遍掃瞄以後,都縮短了待...