数据结构 直接插入排序

Ⅰ )算法思想

       直接插入排序是一种最基本的插入排序方法,其基本操作方法是将第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

#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)直接插入排序是稳定的。



你可能感兴趣的:(数据机构)