改进的插入排序算法

原创 2016年06月01日 20:40:54

使用数组来做插入排序时有三个过程。

第一:要在有序表中查找插入的位置。

第二: 要移动元素,以存储新的元素。

第三:插入元素。

插入元素很简单,给数组赋值就可以了,主要的优化在第一步和第二部,共有2中改进方法,分别对应第一步和第二步。

1. 折半插入排序。

       这种改进的方法主要是在上述第一步,因为是有序表,如果使用折半查找效率比顺序查找高很多。

2. 链式插入排序。

      这种改进方法在第二步,使用链表而不是数组来存储,这用就省去了移动元素的过程。


头文件定义的内容:

#define LENGTH 100   //数组最大长度,测试时可以自己修改

typedef struct Element{
    int key;
    /*other field*/
}Element;

typedef struct Node {
    Element e;
    struct Node * link;
}Node;

typedef Node * List;

//折半插入排序
void insertSort_im1(Element arr[], int n)
{
    int i;
    
    for(i = 1; i < n; i++)//依次将第i个元素插入数组
    {
        int left = 0;
        int right = i -1;
        int mid = 0;
        int j;
        Element temp = arr[i];//保存值,不然移动数组时会被覆盖
        //查找插入位置
        while(left <= right)
        {
            mid = (left + right)/2;

            if(arr[i].key >= arr[mid].key)//关键字相同时放在这能保持排序的稳定性
            {
                left = mid + 1;
            }
            else
            {
                right = mid -1;
            }                
        }
        //移动元素,存储新插入的元素,插入到right后面
        for(j = i -1; j > right; j--)
            arr[j+1] = arr[j];
        //插入
        arr[right+1] = temp;
    }
}



//链式插入排序, 链表设计成带头结点

//这个程序需要注意的地方是当传送链表指针时,需要先保存好下一个节点的连接,因为传入的参数可能会修改指针指向的内容。

void insertNode(List plist, Node * pnode)//有序表上插入一个结点
{
    Node * prev = plist;
    Node * current = prev->link;
    
    if(!pnode)
        return;
    while(current&& pnode->e.key >= current->e.key)
    {
        prev = current;
        current = current->link;
    }
    pnode->link = prev->link;
    prev->link = pnode;
}

void insertSort_im2(List plist)
{
    Node * current = plist->link;
    
    plist->link = NULL;//重置为空表,表示有序表
    while(current)
    {
        Node * temp;
        
        temp = current->link;  //需要保存下一个连接,因为下面插入结点的函数会修改current的内容
        insertNode(plist, current);
        current = temp;
    }
}

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

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

经典排序算法----直接插入排序算法及其改进(稳定)

直接插入,平均情况O(n2),最好情况O(n),最坏情况O(n2),辅助空间O(1),稳定。...
  • qianqin_2014
  • qianqin_2014
  • 2016年04月21日 21:17
  • 685

插入排序及插入排序改进

插入排序,在算法导论里面的介绍对数组
  • jun2016425
  • jun2016425
  • 2016年11月07日 00:03
  • 185

快速排序的改进算法(和插入排序结合)

  • 2009年10月23日 14:52
  • 1KB
  • 下载

程序算法艺术与实践:经典排序算法之插入排序

插入排序(Insertion Sort)的基本思想是每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。基本思想与伪代码经过j-1遍处理后,A[1...
  • utimes
  • utimes
  • 2015年09月19日 13:49
  • 1610

浅谈直接插入排序算法思想以及时间复杂度分析

研究意义 直接插入排序是最基本的一种排序算法,其思想简单,容易掌握,对后期的学习也有一定的帮助。 必备知识(之后不在累述叙述) 排序:将一组杂乱无章的数据排列成一个按关键字有序的序列。 稳定性:关键...
  • q814507462
  • q814507462
  • 2017年06月13日 20:24
  • 589

希尔排序(插入排序的改进)C++实现

算法描述: 相对于直接插入排序,希尔排序将数组元素按下标的一定增量分组,对每组进行直接插入排序,随着增量的不断减小,每组包含的元素也就越多,当增量为1时,整个数组被分为一个组,进行直接插入排序之后结...
  • u014594922
  • u014594922
  • 2016年05月10日 14:34
  • 672

排序算法之插入排序及其改进

另一个O(n^2)级别的算法:插入排序Insertion Sort插入排序的过程: 插入排序的代码: c++:template void InsertionSort(T arr[], in...
  • xqclll
  • xqclll
  • 2017年03月16日 18:59
  • 430

insert sort algorithm 插入排序算法 java实现

insert-sort-insert sort algorithm 插入排序算法插入排序就是将数组后面的数据和数组前面的数据进行比较,如果符合条件,就插入到那个位置java代码实现,如下:for (i...
  • liqingsanjin
  • liqingsanjin
  • 2017年02月16日 16:03
  • 460

算法:链表的插入排序

LeetCode OJ 编程题:Sort a linked list using insertion sort.
  • zaizai09
  • zaizai09
  • 2014年04月10日 10:44
  • 1004
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:改进的插入排序算法
举报原因:
原因补充:

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