插入排序
参考文献:
1、算法导论
2、网络
------------------------------------------------------------------------------------------
插入算法类似于打扑克时,将扑克牌插入的操作,手中的牌是有序的,桌子上的是无序的,带插入的,所有的牌就是给定的数组元素。
来看一下具体的算法操作:
1、手拿第一张牌时,这肯定是排好序了的。
2、摸第二张牌,与第一张比较,大的话放后面,小的话放前面,注意“放前面”的具体操作:将第一张牌后移,将第二张牌放入第一张牌以前的位置。
3、手里有N张牌时,摸起一张牌,和手中的牌比较:比较过程为将此牌与手中最后一张牌比较比较,如果小的话将被比较的牌后移一个位置,继续和倒数第二张牌比较,如果小的话,将被比较的牌后移一个位置,逐一比较,如果大于等于某个位置的牌,就将手中的牌插入它的后面位置。
4、桌上的牌摸完,排序过程结束。
C语言实现代码如下:
#include <stdio.h>
#define LEN 8
int a[LEN] = {2, 1, 4, 8, 9, 6, 7, 3};//这是所有的牌
void insert(void)
{
int i, j, key;
for (j = 1; j < LEN; j++)//从第2张开始摸牌,第1张认为已经在手中了,注意这里的第几比在数组中的位置大1
{
key = a[j];//摸起第j+1张牌
i = j - 1; //找到手中最后一张牌的位置,i看成手指,指向手中要和摸起的牌相比较的牌
while (i >= 0 && a[i] > key)//将摸起的牌与手中手指指向的牌比较大小,摸起的牌小的话,就进入循环逐一向前找,同时查看是否找到最前位置了
{
a[i+1] = a[i];//在循环中,说明还没找到位置,将手中的牌逐一后移
i--; //手指指向前一张牌,以便与摸起的牌相比较
}
a[i+1] = key;//找到了要插入的位置,将摸的牌插入手指指向的牌的后面
}
printf("insert: %d, %d, %d, %d, %d, %d, %d, //打印,查看排好的牌
%d/n",
a[0], a[1], a[2], a[3], a[4], a[5],
a[6], a[7]);
}
int main(void)
{
insert();
return 0;
}
在C程序中,我采用了类比的说法来解释了插入算法的思想,感觉差不多说清楚了。
关于算法的性能,比较专业的介绍,以及采用其他编程语言的实现,以后再补充。