助力快速掌握 冒泡排序 原理及應用 使有限時間 具備無限可能 |
我們的初衷是將一種簡單的生活方式帶給世人 爲初學者節省寶貴的時間,避免採坑! |
Chinar 教程效果
1
Intro —— 簡介
冒泡排序/Bubble Sort,是一種較簡單的排序算法。
運行原理:
1. 通過循環遍歷要排序的元素序列;
2. 依次比較相鄰的兩個元素,根據要求條件(大/小),交換兩元素位置,從而使最(大/小)元素到達數列頂端;
3. 多次循環,直到沒有相鄰元素需要交換,表明數列以排序完成。
因數列中的最(大/小)元素,經交換,慢慢"浮動"
到數列頂端。
如同氣泡由水底上浮到水面的過程一般,因此得名- 《冒泡排序》
2
Demo —— 例子
第一種方案:
按照基本概念,代碼設計實現後,發現循環了90次,纔將數列排好。
for (int j = 0; j < ints.Length; j++) //使以下循環執行多次:ints.Length 次
{
/*從頭到尾,依次訪問元素。
循環一次後,最大元素已經交換到了數列最右邊。也就是ints[ints.Length - 1]一定是最大的。
*/
for (int i = 0; i < ints.Length - 1; i++)
{
cycleIndex++; //計數
if (ints[i] > ints[i + 1]) //比較兩個相鄰元素,將兩者數據交換
{
ints[i] += ints[i + 1];
ints[i + 1] = ints[i] - ints[i + 1];
ints[i] = ints[i] - ints[i + 1];
}
}
}
執行後
元素值:0
元素值:1
元素值:2
元素值:3
元素值:5
元素值:6
元素值:7
元素值:8
元素值:9
元素值:10
----------------------------------------------
循環次數:90
Chinar
總結,對於新手來講,冒泡排序會有哪幾個難點:
-
兩層循環的意義:
外層循環決定本次排序需要 排幾輪,有幾個數排幾輪,內層循環是真正的比較相鄰兩數的大小
-
內層循環J的取值範圍:
數據長度-已排序好數據個數-1
,爲什麼要減一:因爲從第一個數開始與自身往後一索引數比較,所以不能爲 -最後一個數,因此要減一,也就是說當j等於倒數第二個數時,整個數列都比較了一遍
3
Demo2 —— 例子2
第二種方案:
我們浪費的就是每次已經處理過的數據,我們再次進行了循環比較,這樣做毫無意義。
for (int j = 0; j < ints.Length; j++) //使以下循環執行多次
{
/*只從頭到尾,依次訪問元素。
循環一次後,最大元素已經交換到了數列最右邊,也就是最後一個元素此時最大。
那麼下一輪循環比較時,就無需再比較它,浪費一次循環。
我們無需將已經浮動到右端的元素,再做比較。
優化:需要在每一輪循環比較時,跳過我們已經處理過的數據。
這樣 45次循環,即可完成排序
*/
for (int i = 0; i < ints.Length - j - 1; i++)
{
cycleIndex++; //計數
if (ints[i] > ints[i + 1]) //比較兩個相鄰元素,將兩者數據交換
{
ints[i] += ints[i + 1];
ints[i + 1] = ints[i] - ints[i + 1];
ints[i] = ints[i] - ints[i + 1];
}
}
}
執行後
元素值:0
元素值:1
元素值:2
元素值:3
元素值:5
元素值:6
元素值:7
元素值:8
元素值:9
元素值:10
----------------------------------------------
循環次數:45
在每一輪循環比較時,跳過我們已經處理過的數據。
這樣 45次循環,即可完成排序
4
Other —— 其他寫法
至此:完!
支持
May Be —— 開發者,總有一天要做的事!
Chinar 提供一站式《零》基礎教程 使有限時間 具備無限可能! |
Chinar 免費服務器、建站教程全攻略!( Chinar Blog )
本博客爲非營利性個人原創,除部分有明確署名的作品外,所刊登的所有作品的著作權均爲本人所擁有,本人保留所有法定權利。違者必究
對於需要複製、轉載、鏈接和傳播博客文章或內容的,請及時和本博主進行聯繫,留言,Email: [email protected]
對於經本博主明確授權和許可使用文章及內容的,使用時請註明文章或內容出處並註明網址