排序算法——插入排序

原创 2016年06月01日 10:55:24

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


插入排序的原理:

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

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


排序算法(三)——插入排序及改进

插入排序 基本思想 在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数找到相应位置并插入,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。 ...

基础排序算法(二)——插入排序

之前写了一个冒泡排序算法,这里在加一个插入排序算法,链接里讲得也比较详细,不过为了熟练,还是自己亲自敲一遍,再次贴出来,分享一下 还是先上代码: public void InsertS...

排序算法(一)——直接插入排序

直接插入排序简单、容易实现,当记录叫少是可以选择,但是记录较多时大量的比较移动,效率非常低。直接插入排序是一种稳定的排序方法。...

排序算法(三)——插入排序及改进

插入排序 基本思想 在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数找到相应位置并插入,使得这n个数也是排好顺序的。如此反复循环,直到全部排好...

排序算法——直接插入排序

排序算法、直接插入排序

排序算法之一——插入排序

大多数纸牌玩家都用插入排序方法来给纸牌排序:他们保持手上的纸牌有序,每新抓取一张纸牌,将新纸牌插入到合适的位置。要对数组x[n]进行排序,我们从有序子数组x[0..0]开始(只包含一个元素x[0],当...

简单排序算法之——插入排序

由现实中的插队,引出插入排序的思想,再由插入排序和冒泡排序相同的时间界限,引出排序算法突破二次时间界限的关键所在,为排序算法学习中承上启下的一篇博客...

排序算法(Java语言)——插入排序

最简单的排序算法之一是插入排序(insertion sort)。插入排序由N-1趟排序组成。对于p=1到N-1趟,插入排序保证从位置0到p上的元素为已排序状态。插入排序利用了这样的事实:已知位置0到位...

排序算法自我练习(三)——插入排序

插入排序
  • teen11
  • teen11
  • 2015年10月10日 21:33
  • 95

排序算法3——插入排序

选择排序(Selection Sort)通过多次比较和交换来实现排序,其排序流程如下: 1.选取数组中最小的一个元素和数组的第一个元素交换。 2.接着从剩下的所有元素中选择最小的与第二个元素交换。...
  • xchl123
  • xchl123
  • 2014年05月02日 19:51
  • 441
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:排序算法——插入排序
举报原因:
原因补充:

(最多只允许输入30个字)