您的位置:首页 > 理论基础 > 数据结构算法

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

2009-12-10 22:15 351 查看
/*直接插入排序*/

#include<stdio.h>

#include<stdlib.h>

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,你一定不会从头或者从最后开始一个一个地进行比较.你会直接到中间进行比较---显然这样会快很多,因为你能确定原来的序列是有序的.这样就得到了插入排序的改进算法之一-----折半插入排序,只不过由于位置是确定的,所以移动元素的个数也就一定是确定的.也就是说优化的地方只是在查找这个部分,利用排好的序列是有序表这个特定,将原来的效率比较低下的一个一个比较的查找换成了折半查找,即差距也不是很大..

**/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: