[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,得到完整的有序序列
  • 时间复杂度 - 由增量序列决定
posted @ 2018-10-27 14:57  break大蜗牛  阅读(179)  评论(0编辑  收藏  举报