插入排序
// 直接插入不带哨兵
void InserSort(int A[], int n) {
int i, j, temp;
for(int i = 1; i < n; i++) {
if(A[i] < A[i - 1]) {
temp = A[i];
for(j = i - 1; j >= 0 && A[j] > temp; --j) { // 比temp大的全部往后走
A[j + 1] = A[j];
}
A[j + 1] = temp;
}
}
}
// 直接插入带哨兵
void InserSort(int A[], int n) {
int i, j;
for(i = 2; i <= n; i++) {
if(A[i] < A[i - 1]) {
A[0] = A[i];
for(j = i - 1; A[j] > A[0]; --j) {
A[j + 1] = A[j];
}
A[j + 1] = A[0];
}
}
}
// 折半插入带哨兵
void InsertSort(int A[]. int n) {
int i, j, mid, high, low;
for(i = 2; i <= n; i++) {
A[0] = A[i];
low = 1;
high = i - 1;
while(low <= high) { // 折半查找要插入的数在前面的有序数列的哪两个数之间
mid = (low + high) / 2;
if(A[mid] > A[0])
high = mid -1;
else low = mid + 1;
}
for(j = i - 1; j >= high + 1; --j) { // 要插入位置的右边后退一步
A[j + 1] = A[j];
}
A[high + 1] = A[0];
}
}
-
空间复杂度:O(1)
-
最好时间复杂度:O(n)
最坏时间复杂度:O(n2)
平均时间复杂度:O(n2) -
算法稳定性:稳定
-
直接插入排序算法适用于顺序存储和链式存储的线性表