前言
本章我們繼續學習另外一個排序演算法 插入排序
插入排序
也算是我們 O(n^2)
的經典排序演算法之一插入排序
其實非常簡單, 在我們日常當中也是常見的一種思想,可能相對而言大家並沒有歸類總結。所以可能大家使用過,但是並不知曉。
舉個生活栗子
我們在打 撲克牌
的時候,我們整理牌的思想,差不多就是 插入排序
的思想。
換句話說,就是把牌插入到相對合適的位置。當我們把手上所有的牌插入到指定位置,我們的牌就插入完成了
插入排序,先簡單瞭解一下思路
- 首先我們有這麼一段資料,我們需要將他們重新整合有序
| 7 | 2 | 1 | 5 | 4 | 6 | 9 | 3 | 8 |
第一次排序
- 用插入排序的思路就是先找到拿到數字座標
0
也就是7
- 但是和選擇排序不同的時候,此時我們並不會去移動
7
| 7 | 2 | 1 | 5 | 4 | 6 | 9 | 3 | 8 |
第二次排序
- 接下來我們繼續對數字座標
1
的數字,和前面的數字進行一個對比 - 顯然
2
比7
小,我們就將2
放在7
的前面 - 此時|
2
|7
|已然排序完成
|2
|7
| 1 | 5 | 4 | 6 | 9 | 3 | 8 |
第三次排序
- 接下來我們繼續對數字座標
2
的數字,和前面的數字進行一個對比 - 顯然
1
比7
小,我們就將1
放在7
的前面 - 然後再拿
1
和2
對比,1
比2
小,我們就將1
放在7
的前面 - 此時 |
1
|2
|7
| 已然排序完成
|1
|2
|7
| 5 | 4 | 6 | 9 | 3 | 8 |
第四次排序
- 接下來我們繼續對數字座標
3
的數字,和前面的數字進行一個對比 - 顯然
5
比7
小,我們就將5
放在7
的前面 - 然後再拿
5
和2
對比,5
比2
大,我們就將5
原定不動 - 此時|
1
|2
|5
|7
|已然排序完成
|1
|2
|5
|7
| 4 | 6 | 9 | 3 | 8 |
TimAutumnWind (轉載請註明出處 learnku.com/users/48310)
此後一直以此類推,直至到底
實現一下程式碼 - for
- 時間和效能記錄,可以參照上一章節中的
選擇排序
- 以後會直接實現程式碼
/** * 插入排序操作方法 - for * @param $sort * @param $n * @return mixed */ function get_insertion_sort_for($sort,$n){ /** 將資料迴圈一次 */ for ($i = 0; $i < $n; $i++ ){ /** 將前面資料進行迴圈 */ for($j = $i;$j > 0; $j--){ /** 如果當前數字小於前面數字,則為 true */ if($sort[$j] < $sort[$j - 1]){ /** * 如果當前數字小於前面數字,則進行位置交換 * php 沒有位置交換的函式,所以簡單一點,先取出,再覆蓋 */ $val = $sort[$j]; $sort[$j] = $sort[$j - 1]; $sort[$j - 1] = $val; }else{ /** 如果大於前面數字,則跳出,不進行位置交換 */ break; } } } return $sort; }
實現一下程式碼 - for
- tips: 在 php 當中,while 要比 for 快一丟丟
/** * 插入排序操作方法 - while * @param $sort * @param $n * @return mixed */ function get_insertion_sort_while($sort,$n){ $i = 0; while ( $i < $n ){ $j = $i; while($j > 0){ if($sort[$j] < $sort[$j - 1]){ $val = $sort[$j]; $sort[$j] = $sort[$j - 1]; $sort[$j - 1] = $val; }else{ break; } $j--; } $i++; } return $sort; }
本作品採用《CC 協議》,轉載必須註明作者和本文連結
TimAutumnWind (轉載請註明出處 https://learnku.com/articles/39442)