八大排序算法——插入排序(動圖演示 思路分析 實例代碼java 復雜度分析)


一、動圖演示

 

 

二、思路分析

例如從小到大排序:

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)); } }

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM