聊完選擇排序,這篇咱們來聊聊插入排序。java
設想下你如今要安排一隊人按照身高從低到高排序站立,你的排序方法極可能是一我的一我的來,將每個人插入到當前已經有序的隊列中去,爲了給要插入的人(元素)騰出空間,咱們須要將當前隊列中全部比待插入人長得高的人向右移動一我的的位置,以給待插入的人騰出空間。算法
這就叫插入排序。數組
此次咱們直接上圖來具象化展現插入排序的過程:post
下面咱們直接上嵌套循環版本的代碼,遞歸版本的代碼且略過不寫,仍是以 Java 爲例:spa
/** * @see: 插入排序的 Java 實現,使用快慢指針思路 * @param array: 待排序數組,咱們採用原地排序 */
public static void sortInsert(int[] array){
//外層咱們先假定數組第一個元素已部分有序,
//即第一個元素已在它該在的位置,
//從數組第二個元素開始遍歷,固然數組長度可能小於2
for (int slow = 1; slow < array.length; slow ++){
//待插入元素 array[slow]
int insertion = array[slow];
//內循環遍歷,主要爲肯定待插入元素array[slow]的待插入位置
int fast = slow - 1;//內循環快指針
for (; fast >= 0; fast --){
if (array[fast] > insertion){
array[fast + 1] = array[fast];
}else {
//待插入元素的待插入位置,老是從後往前看,最後一個值比它大的那個位置,
//值比它大的那些值總體日後移動一個位置
break;
}
}
//插入待插入元素,即最後一個值比它大的那個位置
array[fast + 1] = insertion;
}
}
複製代碼
插入排序是典型的運行時間嚴重依賴輸入的算法,插入排序運行的平均和最壞時間複雜度都是平方級別的 О(n²),但若是待排序數組是一個已經總體有序的數組,則只須要線性級別的時間複雜度 О(n) 便可運行完算法。指針
下篇,咱們聊希爾排序。code