經典排序算法--直接插入排序


算法描述:

  插入排序:插入即表示將一個新的數據插入到一個有序數組中,並繼續保持有序。例如有一個長度為N的無序數組,進行N-1次的插入即能完成排序;第一次,數組第1個數認為是有序的數組,將數組第二個元素插入僅有1個有序的數組中;第二次,數組前兩個元素組成有序的數組,將數組第三個元素插入由兩個元素構成的有序數組中......第N-1次,數組前N-1個元素組成有序的數組,將數組的第N個元素插入由N-1個元素構成的有序數組中,則完成了整個插入排序。

白話理解:

  很多排序方法,都可以用我們小時候上學排隊的方式來解釋。插入排序,想一下以前在上課的時候,老師在給我們排隊時,有沒有這樣的舉動,讓你和在你前面的同學,比身高,如果你比前面的同學矮的話,前面的同學就站到你的位置,然后你在和你現在前面的同學進行身高比較,如果你還是比較矮的話,前面的同學則換到你的位置。直到你比前面同學高為止,將你插入前面同學后面。

  假設老師從第二個同學開始調整位置,然后一直調整到最后一位,那么這種排序的方法就叫做插入排序。

下面以五個無序數據為例:

  3,1,5,4,2

第一次排序,1比3小,則1和3換位置,變為了1,3,5,4,2

第二次排序,5比3大,不需要調整,仍未1,3,5,4,2

第三次排序,4比5小,則4和5 換位置,此時4比3大,則不再繼續調整,此時變為了1,3,4,5,2

第四次排序,2比5小,2和5換位置,2又比4小,2繼續和4換位置,2仍然比3小,繼續和3換位置,最后2比1大,不再調整。最終,變成了1,2,3,4,5.

數據變成了有序。

Java代碼實現

 1 package sortDemo;
 2 
 3 /**
 4  * 插入代碼實現
 5  * @author xianyu
 6  * @CreatTime 下午8:16:11
 7  */
 8 public class InsertDemo {
 9     
10     public static void main(String[] args) {
11         int[] sort ={3,2,1,4,6,5,8,9,10,7} ;
12         System.out.println("排序前:");
13         print(sort);
14         insertSort(sort);
15         System.out.println("\n排序后:");
16         print(sort);
17     }
18     
19     
20     /**
21      * 直接插入算法排序
22      * @param a
23      */
24     public static void insertSort(int[] a){
25         //從下標為1開始比較,知道數組的末尾
26         for (int i = 1; i < a.length; i++) {
27             int j;
28             //將要比較的元素,拿出待比較過后再插入數組
29             int tmp = a[i];
30             //一次與前一元素比較,如果前一元素比要插入的元素大,則互換位置
31             for (j = i-1; j >=0&&a[j]>tmp; j--) {
32                 a[j+1] = a[j];
33             }
34             //將比較的元素插入
35             a[j+1] = tmp;
36         }
37     }
38     
39     public static void print(int[] a){
40         for (int i = 0; i < a.length; i++) {
41             System.out.print(a[i]+" ");
42         }
43     }
44 }

分析復雜度

 ①插入排序的時間復雜度 就是判斷比較次數有多少,而比較次數與 待排數組的初始順序有關,當待排數組有序時,沒有移動操作(第31行for不成立),此時復雜度為O(N),當待排數組是逆序時,比較次數達到最大--對於下標 i 處的元素,需要比較 i-1 次。總的比較次數:1+2+...+N-1 ,故時間復雜度為O(N^2)

①可以看出,算法中只用到了一個臨時變量(第29行),故空間復雜度為O(1).

 

由第31行循環條件,a[j]>tmp可以看出,當數組中,有兩元素相同時,並不替換位置,所以可以得出,直接插入排序是穩定排序。


免責聲明!

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



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