数据结构-8.2排序

前言-数据结构

数据结构是需要反复咀嚼,不管什么时候都可以重中获取现在在开发中的遇到的问题答案。

插入排序

  • 插入排序的基本原理,每步将一个待排序的对象,按其关键码大小,插入到前面已经排好序的一组对象适当位置上,直到对象全部插入为止。常见的插入排序方法有:
    • 直接插入排序,
    • 折半插入排序,
    • shell排序等

直接插入排序

  • 基本思想
    当插入第1个数据对象时,前面的数据对象1.V2…Vi - 1已经排好序,此时用vi的关键码与V1,2…Vi - 1的关键码顺序进行比较,找到插入位置,即将Vi插入,位置以后的对象向后移.
  • 算法步骤
  • 设待排序的记录存放在数组.r[1…n]中,r[1]是个有序序列。
  • 循环n-1次,每次使用顺序查找法,查找r[i] (i=2,…n)在 已排好序的序列r[1…i-1]中的插入位置,然后将心插入表长为-1的有序序列r[1…i-1],直到将r[n]插入表长为n-1的有序序列r[1…i-1],最后得到一个表长为n的有序序列
  • 例子:举例,n=6,数组R的六个排序码分别为: 17, 3, 25, 14, 20, 9。它的直接插入排序的执行过程下图所示。
    在这里插入图片描述
  • 性能分析
  • 考虑关键码的比较次数和数据对象移动次数,最好情况时两者分别为n-1和0,最坏的情况为:
    • 比较次数= 1+2+… +n1= n(n-1)/2
    • 移动次数= (1+2)+(2+2)+… +(n-1+2)= (n+4)(n-1)/2「这里的2是指 初始化一次 然后 插入最前面一次 一共2次」
    • 直接插入排序的时间复杂度为0(n2)。
  • 直接插入排序的空间复杂度为0(1)。
  • 直接插入排序是一种稳定的排序方法。

折半插入排序

  • 基本思想
    当插入第i个数据对象时,前面的数据对象V1 V2 … Vi-1已经排好序,此时用vi的关键码与V1 V2 … Vi-1的关键码按折半方法进行比较,找到插入位置j,即将Vi插入,位置j以后的对象向后顺移。
  • 算法步骤
  • 设待排序的记录存放在数组r[1…n]中,r[1]是个有序序列。
  • 循环n-1次,每次使用折半查找法,查找ri在已排好 序的序列r[1…i-1]中的插入位置,然后将r面插入表长为-的有序序列r[1…i-1],直到将r[n]插入 表长为n-1的有序序列r[1…i-1],最后得到一个表长为n的有序序列。
  • 例子
    在这里插入图片描述
  • 性能分析
  • 折半插入排序是在直接插入排序的基础上建立的,它只是减少了数据对象的比较次数,而移动次数并没有什么变化,所以它的时间复杂度仍为0(n2)。
  • 折半插入排序的空间复杂度为0(1)。
  • 折半插入排序是一种稳定的排序方法。

shell排序

  • 基本思想
    设待排序的数据对象有n个,首先取一个整数d < n作为间隔,将全部对象分为个子序列,所有距离为d的对象放在同一个序列中,在每一个 子序列中分别施行直接插入排序,然后缩.小间隔d,如取d=d/2,重复上述的子序列划分和排序工作,直到最后取d为1为止。
  • 算法步骤
  • 第一趟取增量d1(d1<n)把全部记录分成d1个组,所有间隔为d1的记录分在同一组,在各个组中进行直接插入排序。
  • 第二趟取增量d2(d2<n),重复上述的分组和排序。
  • 依次类推,直到所取增量dt=1 (dt+dt-1<…<d2<d1) ,所有记录在同一组中进行直接插入排序为止。
  • 例子
    在这里插入图片描述

在这里插入图片描述

  • 性能分析
  • 对Shell排序的时间复杂度的分析很困难,在特定情况下可以准确地估算关键码的比较和数据对象移动次数,但是考虑到与增量之间的依赖关系,并要给出完整的数学分析,目前做不到。
  • Shell排序中所需的比较和移动次数约为n1.3
  • Knuth的统计结论是数据对象平均比较次数和移动次数是在n1.25与1. 6n1.25之间。
  • 故: Shell排序的时间复杂度为0(n1.3)。
    Shell排序的空间复杂度为O(0)。
    Shell排序是种不稳定的排序方法。

猜你喜欢

转载自blog.csdn.net/weixin_41732253/article/details/109891753
今日推荐