皓月的博客

菜鸟的学习笔记

排序算法——插入排序

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


插入排序的原理:

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

例如,有数组 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]);
    }
}


阅读更多
个人分类: 数据结构和算法
上一篇稳定排序和不稳定排序
下一篇改进的插入排序算法
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭