概述
直接插入排序基本思路:
对于给定的一组记录,初始时假定第一个数是有序序列,其余的按照无序序列;接着从第二个数开始,按照大小插入到之前的有序序列中,直到最后一个数插入到有序序列为止。
图示:
先假定29这个数是个有序序列,从18往后都是无序的。
这样先用18与29比较(18与有序序列的最后一个数比较),比29小,则先让29后移一位,移到18的位置,再把18移到29的位置,这样前两个就排序完毕。
我们直接跳到第四次比较,有代表性。3先和87比较,比他小,就先把3存起来,87后移一位,接着3和87的前一个数比较,还是小,56也后移一位;再和29比较,还是小;直到与18比完还是小,依旧18后移一位,把3插入到原来18的位置。
如此往后,排序完成。
可以借助下面动态图帮助理解:
(动态图来自这位博主)
分析完毕,接下来上代码
#include <stdio.h>
void InsertSort(int *array, int length)
{
int i, j, t;
for(i = 1; i < length; i++) //从第二个数开始
{
t = array[i]; //先把array[i]存起来
for(j = i - 1; j >= 0; j--)
{
if(array[j] > t)
{
array[j + 1] = array[j]; //往后移一个
}
else
{
break; //如果if不成立。直接跳出本次for循环
}
}
array[j + 1] = t; //由于最后一次j循环自减了一次,所以要加一恢复到最后一个j位置。
}
}
int main()
{
int array[6] = {29,18,87,56,3,27};
int i,length;
length = sizeof(array)/sizeof(array[0]);
InsertSort(array, length);
for(i = 0; i < length; i++)
{
printf("%d ", array[i]
}
printf("n");
return 0;
}
稳 定 性:稳定
时间复杂度: O(n^2)
(1)初始数据正序,总比较次数:n-1
(2)初始数据逆序,总比较次数:(n2+n-1)/2= O(n2)
(3)初始数据无序,第i趟平均比较次数(i+1)/2,总次数为:(n2+3n)/4=O(n2)
(4)可见,原始数据越趋向正序,比较次数和移动次数越少。
最后
以上就是端庄小虾米为你收集整理的排序算法:直接插入排序的全部内容,希望文章能够帮你解决排序算法:直接插入排序所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复