一、動圖演示
二、思路分析
例如從小到大排序:
1. 從第二位開始遍歷,
2. 當前數(第一趟是第二位數)與前面的數依次比較,如果前面的數大於當前數,則將這個數放在當前數的位置上,當前數的下標-1,
3. 重復以上步驟,直到當前數不大於前面的某一個數為止,這時,將當前數,放到這個位置,
1-3步就是保證當前數的前面的數都是有序的,內層循環的目的就是將當前數插入到前面的有序序列里
4. 重復以上3步,直到遍歷到最后一位數,並將最后一位數插入到合適的位置,插入排序結束。
根據思路分析,每一趟的執行流程如下圖所示:
三、復雜度分析
1. 時間復雜度:插入算法,就是保證前面的序列是有序的,只需要把當前數插入前面的某一個位置即可。
所以如果數組本來就是有序的,則數組的最好情況下時間復雜度為O(n)
如果數組恰好是倒=倒序,比如原始數組是5 4 3 2 1,想要排成從小到大,則每一趟前面的數都要往后移,一共要執行n-1 + n-2 + … + 2 + 1 = n * (n-1) / 2 = 0.5 * n2 - 0.5 * n次,去掉低次冪及系數,所以最壞情況下時間復雜度為O(n2)
平均時間復雜度(n+n2 )/2,所以平均時間復雜度為O(n2)
2. 空間復雜度:插入排序算法,只需要兩個變量暫存當前數,以及下標,與n的大小無關,所以空間復雜度為:O(1)
四、Java 代碼如下
import java.util.Arrays; public class insertSort { public static void main(String[] args) { int[] n = new int[]{20,12,15,1,5,49,58,24,578,211,20,214,78,35,125,789,11}; int temp = 0,j; for (int i = 1; i < n.length; i++) { temp = n[i]; for (j = i; j >0; j--) { //如果當前數前面的數大於當前數,則把前面的數向后移一個位置
if(n[j-1]>temp){ n[j] = n[j-1]; //第一個數已經移到第二個數,將當前數放到第一個位置,這一趟結束
if(j==1){ n[j-1] = temp; break; } }else{//如果不大於,將當前數放到j的位置,這一趟結束
n[j] = temp; break; } } System.out.println(Arrays.toString(n)); } System.out.println(Arrays.toString(n)); } }