經典排序算法——插入排序

插入排序原理

插入的排序的原理是每趟將一個數按照大小插入到它前面已經排好序的子序列中。依次重複,直到插入所有數字。算法

圖解插入排序原理(升序爲例)

以數組[3,4,1,2]爲例,升序排列數組。數組

第一趟從第2個數據開始(第1個數字本身已經有序),跟前面一個數字比較,若是小於前面數字就將前面數字後移,並繼續向前比較,直到下標小於0爲止。以下圖所示dom

 

第二個數字4,插入到它前面的有序子序列(3)中,因爲4>3因此直接插在3後面即無需移動。第一趟結束。指針i向後移,以下圖所示測試

 

第三個數字1,插入到它前面的有序子序列(3,4)中,因爲1<4因此將4後移一位(數字1會先保存起來,沒必要擔憂被覆蓋),而後再讓1與3比較,1<3,因此3後移一位。子序列遍歷完後,將數字1放入插入位置。接着i指針後移,以下圖所示優化

 

通過3趟比較後,數組中的數字已經排好順序。下面看下具體代碼spa

 1 public static void sort(int[] array){
 2         for (int i = 1; i <array.length ; i++) {
 3             int insertValue = array[i];
 4             int insertIndex = i -1 ;
 5             while (insertIndex >= 0 && insertValue < array[insertIndex]){
 6                 //待插入數字小於前面下標對應的數
 7                 array[insertIndex+1] = array[insertIndex];
 8                 insertIndex --;
 9             }
10             //位置找到 爲insertIndex + 1
11             array[insertIndex + 1] = insertValue;
12         }
13     }

代碼分析

1)第一個for循環用於肯定比較趟數,i從1開始(前面有1個數,1個數的子序列確定有序)到數組最後一個數字3d

2)記錄當前要插入到前面子序列的值(防止子序列數字後移覆蓋)指針

3)while依次序循環子序列,當子序列中數字大於要插入的數字時繼續向前遍歷,直到找到比當前數字更小或子序列遍歷完,插入對應位置code

時間複雜度

從代碼可知,插入排序有兩層循環,因此其時間複雜度爲T(n)=O(n^2)blog

測試算法執行效率

與前面的排序算法相同,咱們依然生成10萬個隨機數的數組,使用插入排序方法進行排序,看其執行時間。測試代碼以下

1 public static void main(String []args){
2         int[] array = new int[100000];
3         for (int i=0; i<100000; i++){
4             array[i] = (int)(Math.random()*800000);
5         }
6         long begin = System.currentTimeMillis();
7         sort(array);
8         System.out.println("總耗時="+(System.currentTimeMillis() - begin));
9     }

測試結果

 

能夠看到插入排序算法比選擇排序更快,10萬個數據的數組排序大概須要1秒多時間。下篇咱們將介紹基於插入算法的優化算法 --希爾排序算法,排序效率是否會更高呢?一塊兒期待!

總結

插入排序算法的思路是從數組的第二個數開始,插入到它前面的有序子序列。依次遍歷數組,直到遍歷完全部數據後,數組即變爲有序。

相關文章
相關標籤/搜索