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

排序算法——插入排序

2016-06-01 10:55 162 查看
以前学习严蔚敏版的数据结构在博客也写过这个算法,现在回过头来看觉得当时思路有点混乱,写得比较复杂而且难理解,现在学习数据结构基础时重写一下,个人觉得数据结构基础比严蔚敏版的要好,因为分析得更加详细思路更清晰,也有完整代码,当然也可能是我第二次学习数据结构的原因。

插入排序的原理:

首先将线性表的第一个元素当成有序表,然后从第二个元素开始,依次插入到第有序表中完成排序。

例如,有数组 5 4 3 2 1, 首先将5 看成有个有序数组,这时只有一个元素。

第一步: 将4 插入5前面,这时有序数组为 4 5,还有 3 2 1没插入

第二部:将3插入4 5 中,这时有序数组为 3 4 5, 还有 2 1

最后依次把 2 和1 插入完成排序。

上面举得例子是插入排序的最差情形,需要移动的次数最多, 时间复杂度为O(n^2),当表中数据项较少时据说是最快的排序方法。

由于在寻找插入位置时,相同的元素我们是不会去移动它位置的,因此插入排序是稳定排序。

可以分3步完成上述排序过程。

1. 寻找插入的位置。

2. 插入元素。

3. 从第二元素开始到最后一个,重复1,2

下面的实现方法将这个实现分成两个函数实现,看起来会更加简洁, 其实合起来写也差不多。

#include <stdio.h>

#define LENGTH 1000   //数组最大长度

typedef struct Element{

    int key;

    /*other field*/

}Element;

//将元素e,按照key插入到有序数组中,当前数组有序个数为i

void insert(Element arr[], int i, Element e)

{

    if(i == LENGTH)

    {

        fprintf(stderr, "array is fulled.\n");

        return;

    }

    //find the position

    while(i >= 0 && e.key < arr[i].key)

    {

        arr[i+1] = arr[i];

        i--;

    }

    //insert

    arr[i+1] = e;

}

void insertSort(Element arr[], int n)

{

    int i;

    

    for(i = 1; i < n; i++)

    {

        insert(arr, i-1, arr[i]);

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息