[Data Structure & Algorithm] 插入排序

排序

  • 内(部)排序 - 排序时不涉及数据的内、外交换,即整个文件都是放在内存中处理
  • 外(部)排序 - 排序时要进行数据的内、外交换

插入排序

直接插入排序 Straight Insertion Sort - 最简单

  • 基本操做
    1.比较关键字
    2.移动记录
  • 具体实现
    • 设置监视哨SqList[0] = i(待插入的值)
    • 从数组的末尾开始循环,把比i大的值都向后移一位,直到碰上比i小的值,插入i
  • 空间上 - 监视哨须要额外空间
  • 时间上 - O(n2)
    • 最好状况 - 正序 - 插入第i个值,比较1次,无需移动
    • 最坏状况 - 逆序 - 插入第i个值,比较i次,移动i-1次
    • 二者平均获得该算法的时间复杂度
  • 适用于
    • 待排序列基本有序
    • n的值比较小

折半插入排序

  • 改进第一步 比较关键字
  • 时间复杂度 - O(n2)
    • 第二步 移动记录的次数不变,因此时间复杂度不变

2路插入排序

  • 同时改进第一步(折半查找)和第二步
  • 基本思路 - 移动记录改进
    1.把第一个记录r[1]做为分界线,将待排序的序列分为两部分
    2.比r[1]小的,插入到r[1]以前的序列中;比r[1]大的,插入到r[1]后面的序列中
  • 空间上 - 须要额外n个空间
  • 时间上 - O(n2)
    • 最好状况 - r[1]在待排序列的中间,则能够减小一半的移动次数
    • 最坏状况 - r[1]是最大或最小值,没有任何优化

希尔排序 Shell‘s sort - 缩小增量排序 Diminishing increment sort

  • 基本思路
    1.肯定增量序列,如{1,3,5}
    - h1= 1的递增整数序列
    2.从增量序列中的最大值开始,依次对待排序列进行划分
    3.对于划分出的子序列用直接插入排序,直到最终的增量为1,获得完整的有序序列
  • 时间复杂度 - 由增量序列决定
相关文章
相关标签/搜索