插入类排序--直接插入排序
在有序数组中插入一个元素,可以作为一种排序方法的基础。
只有一个元素的数组是一个有序数组,对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];
作为基本操作语句
考虑最坏的情况,即整个序列是逆序的 O(n^2)
考虑最好的情况,即整个序列是有序的 O(n)
综上所述,本算法的平均时间复杂度O(n^2)
空间复杂度分析
算法所需的辅助存储空间不随待排序列规模的变化而变化,是个常量,O(1)