{数据结构}直接插入排序

 

/*直接插入排序*/

#include

#include

 

typedef struct 

{

  int *elem;

  int length;

}SqList;

 

void InitSqlist(SqList *L)

{

  int i;

  printf("请输入元素个数:");

  scanf("%d",&(L->length));

  L->elem = (int *)malloc(sizeof(int)*(L->length+1));

  printf("请输入需排序元素:");

  for(i = 1; i <= L->length; i++)

    scanf("%d",L->elem+i);

}

 

void InsertSort(SqList *L)

{

  int i,j;

    for(i = 2; i <= L->length; i++)

    {

            L->elem[0] = L->elem[i];

           if(L->elem[0] < L->elem[i-1])

          {

              for(j = i-1; L->elem[0] < L->elem[j]; j--)

              {

                   L->elem[j+1] = L->elem[j];  

               }

            L->elem[j+1] = L->elem[0];

         }

     }

}

 

void print(SqList L)

{

  int i;

  for(i = 1; i <= L.length; i++)

    printf("%5d",L.elem[i]);

}

 

int main()

{

   SqList L;

   InitSqlist(&L);

   InsertSort(&L);

   print(L);

   return 0;

}

 

/**

算法分析:直接插入排序是一种最简单的排序方法.其基本思想可以归纳为:找一个,排一个

基本实现过程:以第一个元素为基准开始,向后取元素,取一个就进行查找一次,并插入.这样产生的就是一次增加一个元素的有序表.故对于元素个数为N的表,需要进行查找插入N-1次,需要引入一个外部空间.(在程序里是将数组的第0号位置作为外部空间)用来保存正在插入的元素.

 

思想分析:对于排序,我们日常生活中并不少见.甚至可以说极其常见.比如说图书馆的管理员将书有序地插到书架上,首先当然是找到书的编号是在哪个大类,找到那个书架,然后将书的编号与其他的进行比较后进行插入操作.这就类似于插入时的比较.

也就是说,在日常生活中,当面对一批带有编号的物品要求我们按照编号进行排序的时候,我们最先也是最容易想到的方法就是先拿一个出来当做基准,然后再添加一个物品与这个物品做比较,这样就可以得到2个有序地物品,接着再拿出一个,进行比较,接着就能得到三个有序地物品...如此反复,最后就能得到有序的序列. 虽然效率不高...

 

然而,在生活中插入的时候,我们进行查找的时候,当面对已经有的有序序列(设物品个数为n),我们会根据要排序物品的序号进行插入,也就是说我们不会每一个都去比较一次.比如已知的有序序列的第一个序号为0004而最后的一个序号为0550.如果你手上要插入的物品的序号是0200,你一定不会从头或者从最后开始一个一个地进行比较.你会直接到中间进行比较---显然这样会快很多,因为你能确定原来的序列是有序的.这样就得到了插入排序的改进算法之一-----折半插入排序,只不过由于位置是确定的,所以移动元素的个数也就一定是确定的.也就是说优化的地方只是在查找这个部分,利用排好的序列是有序表这个特定,将原来的效率比较低下的一个一个比较的查找换成了折半查找,即差距也不是很大..

 

**/

 

你可能感兴趣的:(C语言)