直接插入排序法介紹
直接插入排序法的思路是:將一個關鍵字插入到一個已經排好序的有序列表中,得到一個新的有序列表。
比如有關鍵字序列{4,2,3,6,5,1},那麼對其進行直接插入排序法進行排序,步驟如下圖:
直接插入排序法算法
java
public static void insertSort(Integer[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
if (arr[i] > arr[i + 1]) { //比較大小
int j = i; //需往右邊移動的關鍵字下標
int temp = arr[i + 1];
while (arr[j] > temp) { //比較大小
arr[j + 1] = arr[j]; //關鍵字右移
if (j <= 0) { //最後跳出循環
break;
}
j--;
}
arr[j] = temp; //插入關鍵字
}
}
}
時間複雜度
從最好情況來看,如{1,2,3,4,5,6}這樣已經排好的序列,比較次數爲n-1次,由於已經排好序了,所以不需要移動,時間複雜度爲。
從最壞情況來看,如{6,5,4,3,2,1}這樣的逆序序列,比較次數爲 = 2+3+4+···+n = 次,記錄的移動次數爲 = 3+4+5+···+n = 次。
所以最壞情況的時間複雜度爲。
從概率來講,如果關鍵字序列都是隨機的,那麼每一個關鍵字出現是有序和非有序的概率是相同的,那麼平均比較次數和移動次數約次。而簡單選擇排序法不管最優還是最差情況,比較次數都爲次,所以從這個角度來看直接插入排序法要優於簡單選擇排序法。
和簡單選擇排序法的性能比較
以下分別使用簡單選擇排序法和直接插入排序法對10萬隨機關鍵字的排序耗時,從結果可以看出直接插入排序的執行時間比簡單選擇排序法快0.4倍。
簡單選擇排序執行時間:7894ms
直接插入排序執行時間:4514ms