vlambda博客
学习文章列表

插入类排序--直接插入排序

在有序数组中插入一个元素,可以作为一种排序方法的基础。
只有一个元素的数组是一个有序数组,对n个元素的数组,可以从第一个元素所构成的单元数组开始,不断实施插入操作。
插入第二个元素,得到2个元素的有序数组。插入第三个元素,得到3个元素的有序数组。
如此反复,得到n个元素的有序数组。

示例

对序列:6,5,8,4,3,1 进行直接插入排序

  • 图中灰色部分代表待排序列

  • 图中透明部分代表已排序列

int main(){ int a[10] = { 6,5,8,4,3,7 };
int temp, j; for (int i = 1; i < 6; ++i){ temp = a[i]; for (j = i - 1; j >= 0 && temp < a[j]; --j){ a[j + 1] = a[j]; } a[j + 1] = temp; } j = 0; while (j < 6){ printf("%d", a[j]); ++j; } return 0;}

时间复杂度分析

由直接插入排序代码,选取最内层

a[j + 1] = a[j];

作为基本操作语句

  1. 考虑最坏的情况,即整个序列是逆序的 O(n^2)

  2. 考虑最好的情况,即整个序列是有序的 O(n)


综上所述,本算法的平均时间复杂度O(n^2)

空间复杂度分析

  • 算法所需的辅助存储空间不随待排序列规模的变化而变化,是个常量,O(1)