改进的插入排序算法

原创 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个数也是排好顺序的。如此反复循环,直到全部排好顺序。 ...

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

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

选择排序(Java语言实现)

package com.shan.selectionSort;/** * * @author shan *选择排序:假设要按升序排列一个数列, *选择排序先找到数列中最小的数,然后将它放到数...
  • stuShan
  • stuShan
  • 2015年10月14日 23:27
  • 532

选择排序及改进方法

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是...

应用于实时性的插入排序算法

  • 2017年09月07日 14:57
  • 174KB
  • 下载

插入排序算法

  • 2014年10月14日 14:47
  • 421B
  • 下载

希尔排序(shell排序)的详细解说,对插入排序算法的改进

希尔排序是D.L.Shell于1959年提出来的一种排序算法,在这之前排序算法的时间复杂度基本都是O(n2)的,希尔排序算法是突破这个时间复杂度的第一批算法之一。插入排序的效率在某些时候是很高的,比如...

java编写的插入排序算法

  • 2013年10月25日 17:40
  • 159KB
  • 下载

插入排序算法(动态数组实现)

  • 2016年04月04日 21:57
  • 165KB
  • 下载

冒泡、选择、插入排序算法小总结

冒泡排序:在排序的过程中总是小的数往前放,大数往后放,相当于气泡往上升(升序排列),所以称为冒泡排序。 思路:如果有 n 个数,则需要 n-1 趟比较(剩下一个数时不需要比较),在第一趟中进行n-1...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:改进的插入排序算法
举报原因:
原因补充:

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