1算法---插入排序

插入排序

参考文献:

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程序中,我采用了类比的说法来解释了插入算法的思想,感觉差不多说清楚了。

关于算法的性能,比较专业的介绍,以及采用其他编程语言的实现,以后再补充。

猜你喜欢

转载自blog.csdn.net/mengzhongmou/article/details/50331887