插入排序思想:
每一趟将一个待排序的记录,按其关键字的大小插入到已经排好序的一组记录的适当位置上,直到所有待排序记录全部插入为止
实现代码如下:
void InsertSort(int a[], int n)
{
int i, j, t;
for (int i = 1; i < n; ++i)
{
t = a[i];
j = i - 1;
while (a[j] > t && j >= 0)
{
a[j + 1] = a[j];
j = j - 1;
}
a[j + 1] = t;
}
}
代码从位置i开始与i之前的数据元素进行比较,有比i小的元素,从前往后赋值,j递减,以此类推,跳出循环时,把i位置的数据赋给j+1位置的数据。
时间复杂度:
最好的情况就是,序列本身如果有序,只需要比较n-1次,时间复杂度为O(n),最坏的情况,待排序列是逆序,因此需要比较次数为1+2+...+n-1 = n(n-1)/2。因此时间复杂度为O(n^2)。
稳定性:
在排序前后,相同元素的相对位置不变,因此直接插入排序是一种稳定的排序算法。