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

数据结构 直接插入排序

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)直接插入排序是稳定的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息