氣泡排序的原理是從第乙個數字開始,依次讓相鄰的兩個數字進行比較,按照從大到小或從小到大的順序進行交換(如果是公升序排列就把小的放前面,如果降序排列就把大的放前面)。
第一趟比較後,就把最大的的數字放在最後乙個位置(假設按照公升序排列),然後進行第二趟比較,依次進行相鄰數字比較,第二趟比較後次大的數字放在了倒數第二個位置。
進行n-1(n代表待排序的數字個數)趟比較後(最後只剩乙個無需比較),數字即為有序排列。
假設要排列的數字為 3 1 4 2 ,當進行第一趟排序時,如下圖所示(其中i表示陣列的下標)
第一趟排序執行完後,陣列中最大的數字4已找到,並放在陣列的最後一後位置,所以後續比較無需再跟最後乙個比較。下面看第二趟排序過程,如下圖
第二趟排序執行完,陣列的次大數字3已找到,並放在陣列的倒數第二的位置。此時由於我們選取的排列資料巧合,第三大的數字2也放在了倒數第三的位置,但按照我們比較邏輯,此時並不知道第三大數字已經找到,所以還會進行第三趟比較。如下圖所示
按照我們的邏輯,當第三趟比較執行完後,第三大的數字2已找到並放在倒數第三位的位置。剩下最後乙個數字1無需再比較它本身的位置就是它應該所在的位置。
我們可以發現,當有4個數字時,只需進行3趟排序即可將無序數字變為有序,而每趟比較都會比上一次少比較一次(因上一趟比較已經確定了乙個較大數字位置)
另外,在我們例子中,第三趟比較前數字已經處於正確的序列,所以無需再進行後續比較(當然我們剛好只比較三趟,如果有5個或更多數字,則可以省去後續比較)
下面看一下具體**實現
11)第一層for迴圈用於確定進行幾趟比較,前面我們分析過,只需進行n-1趟比較即可public
static
void bubblesort(int
array)13}
14if
(flag)17}
18 }
2)第二層for迴圈用於從第1個數字開始,依次跟相鄰數字進行比較。每進行一趟比較後,就可少比較一位數字
3)在進行第二層迴圈比較時,設定乙個標誌位flag,用於標示是否進行了數字交換,如果一次都沒有交換,說明此時數字已經有序,無需進行後續趟的比較
氣泡排序巢狀兩層迴圈進行排序,所以其時間複雜度為t(n)=o(n^2)。
下面我們生成10萬個隨機數的陣列,使用氣泡排序方法進行排序,看其執行時間。在我的後續文章中,會繼續分享其他幾種排序演算法,並會在其他幾種排序演算法中也使用10萬個隨機數計算排序時間。
1執行結果(單位為毫秒)public
static
void
main(string args)
7long begin =system.currenttimemillis();
8bubblesort(array);
9 system.out.println("總耗時="+(system.currenttimemillis()-begin));
10 }
氣泡排序需要記住三點,一是比較的趟數n-1(最後乙個數字無需比較),二是每進行一趟比較後就會確定乙個較大的數字位置,後續趟的比較次數會少一次。還有一點是優化點,當在比較過程中數字的正確順序已經產生後,無需再進行後續趟的比較。
經典排序演算法,氣泡排序
氣泡排序是本人在大一學習c語言的時候就已經學過了,最近這段時間想起來把比較經典的排序演算法拿來回顧一下,鞏固一下知識。氣泡排序的核心就是比較相鄰兩個數的大小,然後將小的 或者大的 放到前面去,經過一趟之後,就能把最小或者最大的放到最前面,第二趟排序的時候,第乙個數不參與排序,從第二個數開始,經過一趟...
經典排序演算法 氣泡排序
對列表的無序部分從頭至尾掃瞄一遍,掃瞄過程中通過不斷交換相鄰兩個元素,最終把最大 小 元素交換到列表末尾。首先比較第一和第二個數,把較大的放在第二位。比較第二個和第三個數,再把較大的數放在第三位。如此比較下去,直到比較完最後兩個數。這樣就把整個列表中最大的數交換到了末尾。上面三步只是完成了對列表無序...
經典排序演算法 氣泡排序
在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大 的數往下沉 較小的往上冒。即 每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。關於程式中4中氣泡排序寫法的說明 bubble sort1 基本的氣泡排序的寫法。bubble so...