{数据结构}直接插入排序
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,你一定不会从头或者从最后开始一个一个地进行比较.你会直接到中间进行比较---显然这样会快很多,因为你能确定原来的序列是有序的.这样就得到了插入排序的改进算法之一-----折半插入排序,只不过由于位置是确定的,所以移动元素的个数也就一定是确定的.也就是说优化的地方只是在查找这个部分,利用排好的序列是有序表这个特定,将原来的效率比较低下的一个一个比较的查找换成了折半查找,即差距也不是很大..
**/
#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,你一定不会从头或者从最后开始一个一个地进行比较.你会直接到中间进行比较---显然这样会快很多,因为你能确定原来的序列是有序的.这样就得到了插入排序的改进算法之一-----折半插入排序,只不过由于位置是确定的,所以移动元素的个数也就一定是确定的.也就是说优化的地方只是在查找这个部分,利用排好的序列是有序表这个特定,将原来的效率比较低下的一个一个比较的查找换成了折半查找,即差距也不是很大..
**/
相关文章推荐
- 数据结构---直接插入排序
- 2015年大二上-数据结构-内部排序-(1)-直接插入排序
- 数据结构之直接插入排序
- 算法与数据结构(四)--插入排序(直接插入排序)
- 一步步学习数据结构和算法之直接插入排序效率分析及java实现
- 数据结构 查找及排序算法、直接插入排序及顺序查找(c语言实现)
- (数据结构)排序--直接插入排序
- 数据结构复习:直接插入排序与二分插入排序的C++实现
- 数据结构排序--直接插入和希尔排序
- 数据结构例程——插入排序之直接插入排序
- 小蚂蚁学习数据结构(35)——直接插入排序
- 数据结构:直接插入排序
- 数据结构--直接插入排序实现
- python数据结构之直接插入排序
- 数据结构学习之直接插入排序
- 【数据结构】直接插入排序
- 数据结构之直接直接插入排序
- 数据结构--直接插入排序
- 【数据结构】直接插入排序_哨兵位
- java数据结构之插入排序(直接插入排序、折半插入排序、希尔排序)