数据结构的故事之插入排序

  好久没写点什么了,最近很多企业都在招实习生,周围很多人也都开始到处投简历找实习了,搞的我们人心惶惶的,压力好大。尤其最近互联网好像很火的样子,作为传统通信行业的烟酒僧们,也都放弃了自己的老本行,开始投向了软开的队伍。

  只可惜我们学的是《信号与系统》、《通信原理》这种底层的理论的通信课程,虽然看起来高大上,其实也就莫过于调制解调编码解码了。虽然也是从大一就开始学C语言,但是跟计算机比起来,无论各方面都相差甚远。说多了都是泪啊!!还是拿起数据结构踏踏实实地打好基础吧!

  排序是数据结构里面很重要的一个章节,经典的排序算法主要有:

  • 插入排序:直接插入排序、折半插入排序、希尔排序
  • 交换排序:冒泡排序、快速排序
  • 选择排序:简单选择排序、堆排序
  • 归并排序
  • 基数排序

  赶紧进入主题,为什么叫插入排序?插入排序把整个待排序的序列分成有序区和无序区,初始时有序区即为待排序序列的第一个记录,然后依次将无序区中的每一个记录插入到有序区中,直到无序区为空。  

1、直接插入排序

void directInsertSort(int arr[],int n){
    int outer,inner;
    for(outer=2; outer<=n; outer++){
        arr[0] = arr[outer];
        for(inner=outer-1; arr[inner]>arr[0]; inner--)
          arr[inner+1] = arr[inner];
        arr[inner+1] = arr[0];
    }
}
arr[0]只是作为一个待插入记录的暂存单元,下同。

2、折半插入排序

void binInsertSort(int arr[],int n){
    int outer,inner;
    int begin,end,mid;
    for(outer=2;outer<=n;outer++){
        arr[0] = arr[outer];
        begin = 1;
        end = outer-1;
        //mid = (begin+end)/2;
        while(begin <= end){
            mid = (begin+end)/2;
            if(arr[mid]>arr[0])
              end = mid-1;
            else
              begin = mid+1;
        }
        for(inner=outer-1;inner>end;inner--)
          arr[inner+1] = arr[inner];
        arr[end+1] = arr[0];
    }
}

3、希尔排序

希尔排序:先将整个待排序记录序列分割成几个子序列,在每个子序列中分别进行直接插入排序,减小增量d,重复前面的操作,直到d=1。

void shellInsertSort(int arr[],int n){
    int d;
    int outer,inner;
    for(d=n/2;d>=1;d/=2){
        for(outer=d+1;outer<=n;outer++){
            arr[0] = arr[outer];
            for(inner=outer;inner>d && arr[0]<arr[inner-d];inner-=d)
                arr[inner] = arr[inner-d];
            arr[inner] = arr[0];
        }
    }
}

改进:每个子序列可以采用折半插入排序。

4、总结

折半插入排序只是在插入记录的时候,由于是插入有序区,所以在寻找插入位置时,可以采用折半查找技术。

直接插入排序:时间复杂度ο(n2),是稳定的排序

折半插入排序:时间复杂度ο(nlog2n),稳定的排序

希尔排序:时间复杂度取决与增量的函数,不稳定的排序

时间: 2024-10-18 21:37:48

数据结构的故事之插入排序的相关文章

数据结构精要------直接插入排序和希尔排序算法

上篇总结中主要实践了算法的内排序的选择排序,那么接下来我们继续实践插入排序排序的两种:直接插入排序和希尔排序算法. -----直接插入排序 package com.sort; /** * 直接插入排序 * * @author weixing-yang * * 算法思路: * 每步将一个待排序的元素,插入到前面已排序好的一组元素中的适当位置, * 直到所有元素全部出入完成为止. */ public class InsertionSort { public void insertionSort(in

[数据结构和算法]折半插入排序算法笔记

/// <summary> /// 步骤: /// 1.记录当前待排元素 /// 2.标记顺序表有序查找区域下界和上界 /// 3.在顺序表有序查找区域中折半查找等待排序元素的位置 /// 4.把顺序表有序查找区域的某些元素后移一位,以空出位置给等待排序的元素 /// 5.在空出的位置填写当前排序元素 /// </summary> /// <param name="elements"></param> static void SqList

数据结构与算法——直接插入排序

好久没写博客了,今天就简单总结下直接插入排序. 什么是直接插入排序? 直接插入排序就是将某一个元素与顺序表中元素进行比较,然后插入到相应的位置,使整个顺序表处于有序状态.有关数据结构的书上都会用扑克牌进行比喻说明,就跟玩扑克一样,当我们拿到几张牌时,要想整理成一个顺子,我们通常的做法就是将小的牌,插到比他大的牌的前面.具体可以看看书,想一想,还是很容易理解的. 直接插入排序的思路:每次将一个待排序的元素按照其关键码的大小插入到一个已经排好序的有序序列中. 直接插入排序有两个基本问题: 如何构造一

数据结构学习之直接插入排序

转自:http://blog.csdn.net/m13666368773/article/details/7506678 看这张图不知道大家可否理解了,在插入排序中,数组会被划分为两种,“有序数组块”和“无序数组块”,第一遍的时候从“无序数组块”中提取一个数20作为有序数组块:第二遍的时候从”无序数组块“中提取一个数60有序的放到”有序数组块中“,也就是20,60:第三遍的时候同理,不同的是发现10比有序数组的值都小,因此20,60位置后移,腾出一个位置让10插入,然后按照这种规律就可以全部插入

数据结构基础(3) --Permutation &amp; 插入排序

Permutation(排列组合) 排列问题: 设R = {r1, r2, ... , rn}是要进行排列的n个元素, Ri = R-{ri}; 集合X中元素的全排列记为Permutation(X), (ri)Permutation(X)表示在全排列Permutation(X)的每一个排列前加上前缀ri得到的排列. R的全排列可归纳定义如下: 当n=1时,Permutation(R)={r},r是集合R中唯一的元素: 当n>1时,Permutation(R)由(r1)Permutation(R1

数据结构笔记——排序——直接插入排序

直接插入排序是一种最简单的排序方法,它的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的,记录数增加1的有序表. 直接插入排序的C语言实现: void InsertSort(ElemType arr[],int N) { int i,j; for(i=2;i<=N;i++) { if(LT(arr[i],arr[i-1])) { arr[0]=arr[i]; arr[i]=arr[i-1]; for(j=i-2;LT(arr[0],arr[j]);j--) arr[j+1]=ar

【 python 学习笔记 -- 数据结构与算法 】插入排序 Insertion Sort

[插入排序]:每次保证列表最左端子序列是排好顺序的,然后取下一个元素,扫描其左端的子序列,将其中大于目标元素的元素右移一个位置,直到找到合适的位置将目标元素插入子序列中.逐步增大排序完成的sublist的长度,最终完成整个列表的排序 算法思路如下: 1. 列表最左边第一个元素认为已经排序好了 2. 取下一个元素(目标元素),在它前面已经排序完成的子序列中从后向前扫描 3. 如果子序列中被扫描的当前元素大于目标元素,则将当前元素右移一个位置 4. 重复第3步,直到被扫描的元素小于或等于目标元素 5

【数据结构与算法】—— 插入排序

插入排序(Insertion sort)是一种简单直观且稳定的排序算法.如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法--插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2).是稳定的排序方法.插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间

【数据结构与算法】插入排序

public class InsertionSort { public static void sort(Integer[] array) { if (array == null || array.length == 0) { return; } Integer value = null; Integer tempIndex = null; for (int i = 1; i < array.length; i++) { value = array[i]; tempIndex = i - 1;