插入排序的平均时间复杂度和最差时间复杂度均为O(n^2)
插入排序是一种原地排序方法
基本思想:
将序列分为“已排序”和“未排序”的左右两部分,每次对“未排序”部分的首元素排序,具体做法是:从“已排序”部分的尾部向头部扫描,找到合适位置将该元素插入(实际代码实现时,寻找插入位置和后移同时进行),“已排序”部分长度加1,“未排序”部分长度减1。初始化状态为:“已排序”部分长度为1(只包含序列的首元素);终止状态为:“已排序”部分长度为N。具体过程如下图所示:
代码:
void process(int a[], int n){
assert(a != NULL);
assert(n > 0);
int i, j;
int tmp;
for(i = 1; i < n; i++){
tmp = a[i]; //保存待插入元素的值,因为后移过程会覆盖该元素
for(j = i-1; a[j] > tmp && j >= 0; j--) //寻找插入位置和后移同时进行
a[j+1] = a[j];
a[j+1] = tmp; //插入
}
}