一. 演算法內容:
將一組未排序的數字,按照從小到大的順序排序。
二 . 演算法思路及步驟:
演算法將元素分為兩部分,假想有一條分界線,它的左邊是已排序的元素,右邊是未排序的元素。演算法將相鄰數字兩兩比較,如果前乙個數字大於後乙個數字,那麼交換這兩個數,否則向後移動乙個數,繼續執行比較操作。每趟比較將最大的乙個值放到分界線右側的位置。
三 . 例項分析:
假設有未排序陣列 [ 3, 1, 2, 7, 4 ] 。
1. 首先將 3 和 1 比較,發現 3 > 1,交換兩數,現在陣列狀態為 [ 1, 3, 2, 7, 4 ] 。
2. 往後移動,此時比較 3 和 2, 發現 3 > 2,交換兩數,現在陣列狀態為 [ 1, 2, 3, 7, 4 ] 。
3. 往後移動,此時比較 3 和 7 ,發現 3 < 7,不用執行任何操作。
4. 往後移動,此時比較 7 和 4,發現 7 > 4,交換兩數,現在陣列狀態為 [ 1, 2, 3, 4, 7 ] 。
5. 可以發現,陣列中最大的數字 7 已經被放到了正確的位置。並且我們又發現,陣列已完成排序,結束(實際上還有其餘操作,這裡為了簡便,略去的其餘操作)。
四. **實現
1void my_swap(int &a, int &b) 67
void bubble_sort(vector &arr) else16}
1718
}19 }
第乙個函式 my_swap,用於交換兩數。
第二個函式 bubble_sort,用於實現氣泡排序。該函式接受乙個陣列,並知道元素個數。外層迴圈控制變數 i ,控制大迴圈,它的範圍是從第乙個數(下標為 0 ) 至倒數第二個數(下標為 n - 1)。因為我們需要兩兩比較,假如 i 的範圍到了最後乙個數,那最後乙個數應該跟誰比較?內層迴圈控制變數 j ,控制每一趟小迴圈,它的範圍是從第二個數(下標為 1)至分界線左側。這樣設定 j 範圍的原因是 : 分界線右側的數字已排序,不需要參與比較,而分界線左側的數字仍然不是完全有序(儘管相對較小的數字靠左),所以需要每一輪 j 都需要從頭開始處理。
【注】需要注意的是,我們的**沒有經過優化,如上例所示,第一趟排序已經讓所有元素有序,但是演算法並未停止,它會一直執行到最後一趟。我們可以設定乙個變數,表示本趟是否進行交換,如果沒有交換發生,則說明排序已經完成,演算法可以及時停止。
氣泡排序 排序 氣泡排序
既然寫了計組思來想去便打算把資料結構也寫下來,寫的時候總是發現看的時候無法發現的問題,受益良多。交換排序的基本思想 exchange until sorted 順序,分支,迴圈 注意偽 的熟悉 下面介紹兩種交換演算法 首先進行聯想,用乙個圖進行輔助聯想 水冒泡過程 頂部是陣列的begin,底部理解為...
氣泡排序 氣泡排序法
冒泡法是一種簡單的排序方法,它的實現非常簡單。首先對n個專案進行掃瞄,比較相領兩個專案的大小,若發現違背大小次序則進行互換,由此可以使n個專案中的最大者換到最後。然後對剩下的未排序好的專案再進行掃瞄,使它們的最大者換到表的最後。以此類推,直到將表全部排序好為止。這種排序方法,每遍掃瞄以後,都縮短了待...
選擇排序,氣泡排序,雙向氣泡排序
氣泡排序和選擇排序是最基本的排序方式,要掌握。氣泡排序重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。選擇排序每一趟從待排序的 資料元素 中選出最小 或最大 的乙個元素,順序放在已排好序的數列的...