直接插入排序

原理:每次將排序中的元素,插入到前面已經排好序的有序序列中去,直到排序完成。數組

步驟:orm

  • 第一步,a[0]爲有序區,待排序區爲a[1..n-1]。令i=1。blog

  • 第二步,將a[1]與a[0]中元素比較,將小的元素放在第一個位置。排序

  • 第三步,以此類推,直到待排序中所有元素插入完成爲止。io

例子:int[] arr={5,2,6,0,9};經行直接插入排序form

圖解:class

 
 

過程:原理

  • 初始狀態:設5爲有序,其中i爲1,即:5 2 0 6 9file

  • 第一趟排序:第i個元素2比5小,則插入到5前面,而後i自增,即 : 2 5 0 6 9im

  • 第二趟排序:第i個元素0比2,5小,則插入到2前面,而後i自增,即:0 2 5 6 9

  • 第三趟排序:第i個元素6比5大,則插入到5後面,而後i自增,即:0 2 5 6 9

  • 第四趟排序:第i個元素9比6大,則插入到6後面,而後i自增,即:0 2 5 6 9

  • 最終的答案爲:0 2 5 6 9

時間複雜度:

1.在最好狀況下,嚴格遞增的數組,比較次數C和移動次數M爲:

C = n - 1
M = 0
時間複雜度爲O(n)。

2.在最壞狀況下,嚴格遞減的數組,比較次數C和移動次數M爲:

C = n(n-1)/2
M = n(n-1)/2
時間複雜度爲O(n2)。

綜上,時間複雜度爲:O(n2)

優缺點:  

  • 優勢 : 穩定,相對於冒泡排序與選擇排序更快;
  • 缺點 : 比較次數不必定,比較次數越少,插入點後的數據移動越多,特別是當數據總量大的時候;

代碼:



public class DirectSort {
    
    public static void main(String[] args) {
        // 直接插入排序1
        int[] arr = { 8, 9, 5, 3, 6, 7, 16 };
        
        int j;
        for (int i = 1; i < arr.length; i++) {
            j = i;
            while (j > 0 && arr[j] < arr[j - 1]) {
                int temp = arr[j - 1];
                arr[j - 1] = arr[j];
                arr[j] = temp;
                j--;
            }
        }
        
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ",");
        }
        
        // 直接插入排序2
        arr = new int[] { 8, 9, 5, 3, 6, 7, 16 };
        for (int i = 1; i < arr.length; i++) {
            int index = 0;
            for (int k = (i - 1); k >= 0; k--) {
                if (arr[i] > arr[k]) {
                    index = k + 1;
                    break;
                }
            }
            
            int temp = arr[i];
            for (int n = i; n > 0 && n >= index; n--) {
                arr[n] = arr[n - 1];
            }
            arr[index] = temp;
        }
        
        System.out.println("---");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ",");
        }
        
    }
}
相關文章
相關標籤/搜索