【排序算法】插入排序原理及Java實現

1、基本思想

直接插入排序的基本操作是將一個記錄插入到已經排好的有序表中,從而得到一個新的、記錄數增1的有序表。對於給定的一組記錄,初始時假定第一個記錄自成一個有序序列,其餘記錄爲無序序列。接着從第二個記錄開始,按照記錄的大小依次將當前處理的記錄插入到其之前的有序序列中,直到最後一個記錄插到有序序列中爲止。

2、複雜度分析

當最好的情況,也就是要排序的表本身就是有序的,此時只有數據比較,沒有數據移動,時間複雜度爲O(n)
當最壞的情況,即待排序的表是逆序的情況,此時需要比較次數爲:2+3+…+n=(n+2)(n-1)/2 次,而記錄移動的最大值也達到了 (n+4)(n-1)/2 次.
如果排序記錄是隨機的,那麼根據概率相同的原則,平均比較和移動次數約爲次這裏寫圖片描述,因此,得出直接插入排序發的時間複雜度爲這裏寫圖片描述。從這裏可以看出,同樣的是時間複雜度這裏寫圖片描述,直接插入排序法比冒泡和簡單選擇排序的性能要好一些。

3、排序過程如下

以數組{38,65,97,76,13,27,49}爲例,
這裏寫圖片描述

4、Java實現如下

public class InsertSort {
    public static void insertSort(int[] a) {
        int i, j, insertNote;// 要插入的數據
        for (i = 1; i < a.length; i++) {// 從數組的第二個元素開始循環將數組中的元素插入
            insertNote = a[i];// 設置數組中的第2個元素爲第一次循環要插入的數據
            j = i - 1;
            while (j >= 0 && insertNote < a[j]) {
                a[j + 1] = a[j];// 如果要插入的元素小於第j個元素,就將第j個元素向後移動
                j--;
            }
            a[j + 1] = insertNote;// 直到要插入的元素不小於第j個元素,將insertNote插入到數組中
        }
    }

    public static void main(String[] args) {
        int a[] = { 38,65,97,76,13,27,49 };
        insertSort(a);
        System.out.println(Arrays.toString(a));
    }
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章