基本思路
在要排序的一組數中,假設前面(n-1) [n>=2] 個數已經是排好順序的,現在要把第n個數插到前面的有序數中,使得這n個數也是排好順序的。如此反覆循環,直到全部排好順序。
代碼實現
- 遍歷數組,每次循環從第二個數字往前插入
- 設定插入數和得到已經排好序列的最後一個數的位數。temp和j=i-1
- 從最後一個數開始向前循環,如果插入數小於當前數,就將當前數向後移動一位
public static void insertSort(int[] data) {
int temp;
// 取第i個數,插入前邊的有序的序列
for(int i = 1;i < data.length; i++){
temp = data[i];
int j;
// 從第i-1的位置上開始比較
for(j = i - 1; j>=0; j--) {
// 若前面的數大,則往後挪一位
if(data[j] > temp) {
data[j+1] = data[j];
} else {
// 否則,說明要插入的數比較大
break;
}
}
// 找到這個位置,插入數據
data[j+1] = temp;
}
}
時間複雜度和空間複雜度
直接插入排序的平均複雜度爲O(n²),最壞時間複雜度:O(n²),空間複雜度:O(1),沒有分配內存。