Ⅰ )算法思想
直接插入排序是一种最基本的插入排序方法,其基本操作方法是将第i个记录插入到第i-1 个已经排好序的记录中。具体过程为:将第i个记录的关键字Ki,顺次与其前面记录的关键字K (i-1) 、K(i-2)、K(i-3),...K1 经行比较,将所有关键字大于Ki 的记录依次向后移动一个位置,直到遇到一个关键字小于或者等于Ki的记录 Kj,此时Kj后面必为空位置,将第i 个记录插入空位置即可。完整的直接插入排序是从 i=2 开始的,也就是说,将第一个记录视为已排好序的单元素子集合,然后,将第二个记录插入到单元素子集合中。从i 循环到 n,即可实现完整的直接插入排序。
Ⅱ)源代码
//直接插入排序
#include<stdio.h>
#define MaxSize 50
typedef struct
{
int key; //记录关键字
}RecordType; //记录类型
typedef struct
{
int length;
RecordType r[MaxSize + 1]; //记录空间,0单元做监视哨
}RecordList;
void InsertSort(RecordTyper[],int length) //直接插入排序
{
for (int i = 2; i <=length; i++) //i从2开始
{
int j; //插入值前一个数的下标
r[0] = r[i]; //将要插入的值赋给监视哨
j= i - 1;
while (r[0].key <r[j].key) //当要插入的值小于前一个数
{
r[j + 1] = r[j];
j = j - 1;
}
r[j + 1] = r[0]; //j=i-1,r[j+1]=r[i],相当于位置不变
}
}
int main(void)
{
RecordType r[] = { 0,12, 15, 85, 45, 67, 65, 90, 50 };
InsertSort(r, 8);
for (int i = 1; i <= 8; i++) //循环输出排序结果
{
printf("%d ",r[i]);
}
return 0;
}
算法的要点:①使用监视哨r[0] 临时保存待插入的记录②从后面往前查找应插入的位置,③查找与移动用同一循环完成。
Ⅲ)算法分析
(1)从空间角度来看,只需要一个辅助空间r[0]。
(2)从时间角度来看,主要时间耗费在关键字比较和移动元素上。
(3)直接插入排序的时间复杂度为O(n^2),空间复杂度为O(1)。
(4)直接插入排序是稳定的。