排序算法之直接插入排序


基本思想

當插入第 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)
  • 穩定性
    直接插入排序是一種穩定的排序算法。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com