排序算法之直接插入排序

基本思想

當插入第i(i1) 個元素,前面的i1 個元素已經排好序。這時用第i 個元素與前i1 個元素進行比較,找到插入位置即將第i 個元素插入,原來位置上的元素向後順移。

代碼

//待排數據存儲在數組a中,以及待排序列的左右邊界
public void InsertSort(int[] a, int left, int right) {
    int temp;//臨時變量
    int i, j;//循環標記
    for (i = left + 1; i <= right; i++) {//遍歷待排序列
        if (a[i] < a[i - 1]) {
            temp = a[i];
            j = i - 1; 
            //向後順移元素,直到找到適當位置插入元素
            do {
                a[j + 1] = a[j];
                j--;
            } while (j >= left && temp < a[j]);
            a[j + 1] = temp;
        }
    }
}

性能分析

  • 時間複雜度
    考慮最壞的情況,即整個序列是逆序的。那麼對於每次外循環,最內循環的執行次數,也是基本操作的執行次數都達到最大值。也就是說,每次插入一個元素都需要順移所有已經排好序的元素。所以該算法的時間複雜度爲O(n2)
    考慮最好的情況,即整個序列是有序的,那麼對於每次外循環,最內循環都不執行。也就是說,每次插入一個元素都不需要移動元素。顯然時間複雜度爲O(n)
    綜上所述,直接插入排序算法的時間複雜度爲O(n2)
  • 空間複雜度
    直接插入排序算法所需的額外空間只有一個臨時變量temp ,因此空間複雜度爲O(1)
  • 穩定性
    直接插入排序是一種穩定的排序算法。
發佈了34 篇原創文章 · 獲贊 0 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章