插入排序是一种原地排序算法,即它的空间复杂度为o(1),原始插入排序的最坏(即原始序列的顺序刚好和我们所希望的顺序相反)和平均时间复杂度均为o(n*n),而在最好的情况下(即原始序列已经是按照我们所希望的顺序排好的序列)为o(n)。
下面的例子展示原始插入排序的整个过程:整个序列存放在数组中,按照从小到大的顺序进行排列。
8 2 4 9 3 6.//原始序列
从第二个元素开始,每个元素依次与其前面已经排好序的每个元素进行比较,直到找到正确的插入位置为止。
对于元素2(首先使用一个关键变量(key)存放它),它前面的8比它大,于是8往后移动,整个序列变成:
8 8 4 9 3 6
此时2前面的所有元素比较完毕,并使用key覆盖第一个8,于是序列变成:
2 8 4 9 3 6
对于元素4,4与8比较,8大于4,于是8往后移动,序列变成:
2 8 8 9 3 6
4再与2比较,2小于4,退出循环,4插入2 和8之间,于是用4覆盖第一个8,序列变成:
2 4 8 9 3 6
依次类推。实现的代码如下:
void InsertSort(int a[], int length)
{
if(NULL == a)
return;
if(length <= 0)
return;
for(int i =1; i < length; i++)
{
int key = a[i];
int j = i - 1;
while(j >= 0 && a[j] > key)
{
a[j+1] = a[j];
j--;
}
a[j+1] = key;
}
}
对于原始插入排序,新插入的元素几乎和已经排好序的每个元素比较了一次(事实上可能不是这样的,如果新插入的元素位于已经排好序的序列中间某个位置),对于在已经排好序的序列中寻找新元素的插入位置,其实没有必要这样一一比较,既然序列已经是有序的

本文对比了原始插入排序和折半插入排序在实际运行中的性能,通过多次试验发现,虽然折半插入排序在寻找插入位置上速度明显更快,但由于数组插入操作的低效,整体运行时间并未显著优于原始插入排序。建议对于频繁插入操作的序列,考虑使用链表存储。
最低0.47元/天 解锁文章
744

被折叠的 条评论
为什么被折叠?



