排序算法如何實現升序/降序?數據“聽話”指南¶
一、數據爲什麼要“聽話”?——排序的意義¶
想象一下,你有一堆雜亂的撲克牌(比如[3, 1, 4, 2]),想快速找到“最小的牌”或者“最大的牌”,怎麼辦?直接翻找太麻煩了!這時候就需要排序算法——讓數據像“聽話的孩子”一樣,按你想要的順序排列(升序或降序)。
簡單來說:
- 升序:從小到大排列(比如[1, 2, 3, 4]);
- 降序:從大到小排列(比如[4, 3, 2, 1]);
- 排序算法就是讓數據“聽話”的規則,不同算法讓數據移動的方式不同,但最終都會排成你想要的順序。
二、冒泡排序:像“氣泡”一樣讓數據“上浮”或“下沉”¶
原理¶
冒泡排序就像水中的氣泡:大的氣泡會“上浮”(大的數往後排),小的氣泡會“下沉”(小的數往前排)。每一輪都會把當前最大的數“冒泡”到末尾,直到所有數排好序。
升序實現(從小到大)¶
以數組[3, 1, 4, 2]爲例,步驟如下:
1. 第一輪:從第一個數開始,比較相鄰兩個數,若前一個比後一個大,交換位置。
- 比較3和1:3>1 → 交換 → [1, 3, 4, 2]
- 比較3和4:3<4 → 不交換
- 比較4和2:4>2 → 交換 → [1, 3, 2, 4]
- 此時最大的數4已“冒泡”到末尾,數組變爲[1, 3, 2, 4]
- 第二輪:忽略已排好的末尾數4,繼續比較前3個數。
- 比較1和3:1<3 → 不交換
- 比較3和2:3>2 → 交換 → [1, 2, 3, 4]
- 此時次大的數3已“冒泡”到倒數第二位,數組排好序。
核心規則:升序時,只要前一個數 > 後一個數,就交換位置,讓大數往後“冒”。
降序實現(從大到小)¶
只需調整交換條件:前一個數 < 後一個數時交換,讓小數往後“沉”。
仍以[3, 1, 4, 2]爲例:
1. 第一輪:
- 比較3和1:3>1 → 不交換(降序要大的在前)
- 比較3和4:3<4 → 交換 → [4, 1, 3, 2]
- 比較3和2:3>2 → 不交換
- 此時最小的數1已“沉”到倒數第二位,數組變爲[4, 1, 3, 2]
- 第二輪:忽略末尾的3和2(已排好?不對,這裏可能需要更仔細的步驟,正確邏輯是每輪確定當前最小的數在正確位置?)
修正:降序的每輪是找當前最小的數,讓它“沉”到末尾。正確步驟:
- 第一輪:從第一個數開始,比較相鄰數,若前一個 < 後一個交換(讓小的數“沉”後)。- [3,1,4,2] → 比較3和1(3>1不交換)→ 比較1和4(1<4交換→[3,4,1,2])→ 比較1和2(1<2交換→[3,4,2,1])
- 此時最小的數1已“沉”到末尾,數組變爲[3,4,2,1]
- 第二輪:忽略末尾1,比較前3個數,繼續找最小的數“沉”到倒數第二位:
- [3,4,2,1] → 比較3和4(3<4交換→[4,3,2,1])→ 比較3和2(3>2不交換)
- 此時次小數2已“沉”到倒數第二位,數組變爲[4,3,2,1]
核心規則:降序時,前一個數 < 後一個數就交換,讓小數往後“沉”。
三、選擇排序:像“選班長”一樣固定位置¶
原理¶
選擇排序就像“選最小的數當班長,放到第一個位置”“選第二小的當副班長,放到第二個位置”……直到所有數排好。
升序實現(從小到大)¶
以數組[3, 1, 4, 2]爲例:
1. 找最小數:遍歷數組,找到最小的數(1),和第一個位置的數(3)交換 → [1, 3, 4, 2]
2. 找次小數:從第二個位置開始遍歷,找到最小的數(2),和第二個位置的數(3)交換 → [1, 2, 4, 3]
3. 找第三小數:從第三個位置開始遍歷,找到最小的數(3),和第三個位置的數(4)交換 → [1, 2, 3, 4]
核心邏輯:每輪確定一個數的位置,升序時把當前最小的數放到“正確位置”。
降序實現(從大到小)¶
只需把“找最小數”改成“找最大數”,然後放到“正確位置”:
以數組[3, 1, 4, 2]爲例:
1. 找最大數:遍歷數組,找到最大的數(4),和第一個位置的數(3)交換 → [4, 1, 3, 2]
2. 找次大數:從第二個位置開始遍歷,找到最大的數(3),和第二個位置的數(1)交換 → [4, 3, 1, 2]
3. 找第三大數:從第三個位置開始遍歷,找到最大的數(2),和第三個位置的數(1)交換 → [4, 3, 2, 1]
核心規則:降序時,每輪找當前最大的數,放到“正確位置”(從左到右,從小到大排就是從右到左從大到小?對!)
四、插入排序:像“整理撲克牌”一樣逐個插入¶
原理¶
插入排序就像打撲克牌時,每次摸一張新牌,把它插入到手中已有牌的正確位置。比如手裏已有[1, 3],摸到2,就把2插入到1和3之間,變成[1, 2, 3]。
升序實現(從小到大)¶
以數組[3, 1, 4, 2]爲例:
1. 初始已有牌:只有第一個數3,數組[3]
2. 插入第二個數1:比較1和已有牌3 → 1<3,插入到3前面 → [1, 3]
3. 插入第三個數4:4>3,直接放到末尾 → [1, 3, 4]
4. 插入第四個數2:比較2和4 → 2<4,插入到4前面;再比較2和3 → 2<3,插入到3前面 → [1, 2, 3, 4]
核心邏輯:把數組分成“已排序”和“未排序”兩部分,每次從“未排序”中取一個數,插入到“已排序”的正確位置。
降序實現(從大到小)¶
只需把“插入到比自己大的數前面”改成“插入到比自己小的數前面”:
以數組[3, 1, 4, 2]爲例:
1. 初始已有牌:[3]
2. 插入1:1<3,直接放到末尾 → [3, 1]
3. 插入4:4>3,插入到最前面 → [4, 3, 1]
4. 插入2:比較2和1 → 2>1,插入到1前面;比較2和3 → 2<3,插入到3後面 → [4, 3, 2, 1]
核心規則:降序時,新數插入到“已排序”中比自己小的數前面(即保持已排序部分從大到小)。
五、數據“聽話”的關鍵:算法的“交換/插入規則”¶
| 算法 | 升序核心規則 | 降序核心規則 | 比喻(數據“聽話”方式) |
|---|---|---|---|
| 冒泡排序 | 大的數往後“冒”(前>後交換) | 小的數往後“沉”(前<後交換) | 氣泡從下往上浮(升)/下沉(降) |
| 選擇排序 | 每輪選最小數放左邊 | 每輪選最大數放左邊 | 選最小的當“排頭”,依次類推 |
| 插入排序 | 逐個插入到已排序部分的正確位置 | 逐個插入到已排序部分的正確位置(從大到小) | 整理撲克牌,新牌按大小插隊 |
六、初學者小建議¶
- 先掌握基礎算法:冒泡、選擇、插入排序是入門“基本功”,理解它們的“移動邏輯”後,再學更復雜的算法(如快速排序、歸併排序)會更輕鬆。
- 用例子“盯”數據:每學一個算法,用簡單數組(比如[5,3,8,1])手動模擬步驟,看數據如何一步步被“指揮”到正確位置。
- 數據“聽話”=算法邏輯清晰:不管升序還是降序,本質是讓算法中的“比較規則”(>或<)決定數據的移動方向,記住規則就能讓數據“乖乖聽話”!
排序算法是編程的“基本功”,就像走路需要先學會邁腿、轉彎一樣。多動手寫幾個例子,數據自然就“聽話”啦!