数据结构 直接插入排序
2017-10-21 16:35
288 查看
Ⅰ )算法思想
直接插入排序是一种最基本的插入排序方法,其基本操作方法是将第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)直接插入排序是稳定的。
相关文章推荐
- 数据结构精要------直接插入排序和希尔排序算法
- 【数据结构----笔记3】插入排序算法之【直接插入排序】
- 数据结构之直接插入排序
- 第十六周--数据结构--项目一-- 插入排序之直接插入排序
- 数据结构之直接插入排序
- C++数据结构--直接插入排序
- 数据结构的排序用直接插入、折半插入、希尔排序、快速排序
- 一步步学习数据结构和算法之直接插入排序效率分析及java实现
- 数据结构——排序——直接插入排序和折半插入排序算法
- [golang] 数据结构-直接插入排序
- 数据结构 查找及排序算法、直接插入排序及顺序查找(c语言实现)
- 数据结构中的排序-直接插入排序法(二)
- 【数据结构】直接插入排序
- 数据结构--直接插入排序
- [算法与数据结构] - No.1 直接插入排序
- PHP数据结构之直接插入排序
- 数据结构-排序: 插入排序(直接插入排序法)
- 【数据结构】-直接插入排序、希尔排序Java实现
- 【数据结构】直接插入排序_哨兵位
- 数据结构-直接插入排序与希尔排序