转载请注明出处:http://blog.youkuaiyun.com/ruoyunliufeng/article/details/26059615
插入排序:它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
一.插入排序算法
/***************************************************************
*版权所有 (C)2014,公司名称。
*
*文件名称:插入排序法
*内容摘要:无
*其它说明:无
*当前版本:V1.0
*作 者:若云流风
*完成日期:2014.5.17
***************************************************************/
#include <stdio.h>
#define N 7
void disp(void);
int a[N]={5,0,7,1,12,11,9};
/*排序函数*/
void InsertionSort(void)
{
int j,p,temp;
for(p=1;p<N;p++)
{
temp=a[p]; //a[p]和左面的有序数列去比较
/*j>0保证不溢出,因为当j=0时啊a[j-1]非法,用a[p]分别与左面的值相比较
**如果a[p]小的话则互换位置,
*/
printf("\n\n排序过程: ");
for(j=p; j>0 && a[j-1]>temp;j--)
{
a[j]=a[j-1];
disp();
}
a[j]=temp;
printf("\n\n新一轮排序结果: ");
disp();
}
}
/*输出函数*/
void disp(void)
{
int i;
// printf("\n排序结果: \n");
printf("\n\n");
for(i=0;i<N;i++)
{
printf("%d", a[i]);
printf(" ");
}
}
int main(void)
{
InsertionSort();
// disp();
return 0;
}
二.算法会说话
1.结果输出
2.结果分析
上图就是每一轮的排序过程和结果。对于7个数的数组,共需要6轮。现在我拿出第三轮来详细讲解这个插入排序。
程序在第二轮已经将前三个数排好了,第三轮将a[3](也就是第四个数)与前面的数相比较。1与7比较,确实比7小所以a[3]被赋值为7,然后1继续向左走,1比5小,a[2]被赋值为5,然后1继续向左走,1比0大,循环终结。将a[1]赋值为1(也就是temp)。