数据结构知识点

    • 第一章 基本概念
      • 1.1 数据关系
      • 1.2 逻辑结构和物理结构
    • 第二章 算法
      • 2.1 算法特性
      • 2.2 算法设计的要求:
      • 2.3 算法时间复杂度
      • 2.4 算法时间复杂度
      • 2.5 总结
    • 第三章、线性表
      • 3.1 线性表的抽象数据类型
      • 3.2 线性表的顺序存储结构
        • 3.2.1 数组计算方法
        • 3.2.2 顺序存储结构的插入与删除
      • 3.3 线性表的链式存储结构
        • 3.3.1 顺序存储结构不足的解决方法
        • 3.3.2 线性表链式存储结构定义
      • 3.3 线性表的链式存储结构
      • 3.4 单链表的读取、插入与删除
      • 3.5 单链表结构与顺序存储结构的优缺点
      • 3.6 静态链表
      • 3.7 循环链表
      • 3.8 循环链表
    • 第四章 栈与队列
      • 4.1 栈的定义
      • 4.2 栈的抽象数据类型
      • 4.3 队列(queue)的定义
    • 第五章 串
    • 第六章 树
      • 6.1 树的定义
      • 6.2 二叉树的定义
        • 6.2.1 特殊二叉树
        • 6.2.2 二叉树的性质
        • 6.2.3 二叉树的存储结构
      • 6.3 二叉树的遍历
      • 6.4 树、森林、二叉树的转换
        • 6.4.1 树转换为二叉树
        • 6.4.2 森林转换为二叉树
        • 6.4.3 二叉树转换为树
        • 6.4.4 二叉树转换为森林
      • 6.5 树与森林的遍历
      • 6.6 哈夫曼树
    • 第七章 图
      • 7.1 图的定义
      • 7.2 图的存储结构
        • 7.2.1 邻接矩阵
        • 7.2.2 邻接表
        • 7.2.3 十字链表
        • 7.2.4 邻接多重表
        • 7.2.5 边集数组
      • 7.3 图的遍历
        • 7.3.1 深度优先遍历(深度优先搜索Depth_First_Search,DFS)
        • 7.3.2 广度优先遍历(广度优先搜索,Breadth_First_Search,BFS)
      • 7.4 最小生成树
      • 7.5 最短路径
    • 第八章 查找
      • 8.1 查找的方法
      • 8.2 二叉树排序
    • 第九章 排序
      • 9.1 排序的稳定性
      • 9.2 冒泡排序
      • 9.3 简单选择排序法
      • 9.4 直接插入排序
      • 9.5 希尔排序
      • 9.6堆排序
      • 9.7 归并排序
      • 9.8 快速排序

第一章 基本概念

1.1 数据关系

数据项 数据元素 数据对象 数据

数据项:数据项组成数据元素,数据项是不可分割的最小单位
数据元素:组成数据的基本单位
数据对象:性质相同的数据元素的集合
数据:描述客观事物的符合

数据结构:相互之间存在一种或多种特定关系的数据元素的集合
数据结构知识点_第1张图片

1.2 逻辑结构和物理结构

逻辑结构:数据对象中数据元素的相互关系

  • 逻辑结构包括:集合结构、线性结构、树形结构、图形结构

物理结构:数据的逻辑结构在计算机中的存储形式,也就是将数据元素存储到存储器

  • 物理结构包括:顺序存储结构、链式存储结构

  • 顺序存储结构:把数据元素存放在地址连续的存储单元,数据间逻辑关系和物理关系是一样的

  • 链式存储结构:把数据元素存储到任意存储单元中,这些单元可以是连续的也可以是不连续的

    链式存储很灵活,不用在意存储的位置,只要有一个存放地址的指针就好了。

数据结构知识点_第2张图片

第二章 算法

算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,且每条指令表示一个或多个操作。

2.1 算法特性

输入、输出、有穷性、确定性、可行性

  • 输入输出:算法具有输入和输出
  • 有穷性:算法不会出现无限循环,并且每个步骤可在可接受时间内完成
  • 确定性:每个步骤都有确定的含义
  • 可行性:算法的每一步都是可行的,也就是每一步都能够通过执行的有限次完成

2.2 算法设计的要求:

  • 正确性
  • 可读性
  • 健壮性
  • 时间效率高、存储量低

2.3 算法时间复杂度

在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随着n的变化情况而确定T(n)的数量级。

时间复杂度,也就是算法的时间度量,表示岁问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同。

一般情况下,随着n的增大,T(n)增大最慢的方法是最优算法

用大写的O()来体现算法复杂度的记法,称为大O法。

如何推导时间复杂度:

数据结构知识点_第3张图片

1、常数阶:O(1)

数据结构知识点_第4张图片

2、线性阶:O(n)

关键在于分析循环结构内部情况,下面程序复杂度为O(n)

int i 
for (i=0;ii++)
{
    //时间复杂度为O(1)的程序
}

3、对数阶:O(log n)

int count=1;
while(countcount=count*2 //时间复杂度为O(1)的程序
}

由于每次count*2以后,就距离n更近了,也就是说有多少个2相乘后大于n,则会退出循环, 2x=n>x=log2n 2 x = n − > x = l o g 2 n ,所以时间复杂度为O(log n)

4、平方阶:O(n^2)

int i,j;
for(i=0;ii++)
{
    for(j=0;j1)的程序
    }
}

相当于循环了n*n次,时间复杂度为O(n^2),如果外部循环m次,时间复杂度为O(n^m)

总结:时间复杂度为循环体的复杂度乘以该循环运行次数

数据结构知识点_第5张图片

数据结构知识点_第6张图片

这里写图片描述

2.4 算法时间复杂度

数据结构知识点_第7张图片

2.5 总结

数据结构知识点_第8张图片

数据结构知识点_第9张图片

第三章、线性表

线性表(List):零个或多个数据元素的有限序列

  • 元素之间是有顺序的:第一个元素无前驱,最后一个元素无后继,其他元素都有前驱和后继

  • 线性表强调是有限的

数学表达:

数据结构知识点_第10张图片

3.1 线性表的抽象数据类型

数据结构知识点_第11张图片
数据结构知识点_第12张图片

3.2 线性表的顺序存储结构

顺序存储结构:用一段地址连续的存储单元一次存储线性表的数据元素

这里写图片描述

线性表存储结构代码:
数据结构知识点_第13张图片

顺序存储结构的三个属性:

  • 存储空间的起始位置:数组data,它的存储位置就是存储空间的存储位置
  • 线性表的最大存储容量:数组长度MaxSize
  • 线性表的当前长度:length

3.2.1 数组计算方法

数据元素的序号和存放它的数组下标之间的对应关系:

数据结构知识点_第14张图片

第i+1个数据元素和第i个数据元素存储位置的关系: LOC(ai+1)=LOC(ai)+c L O C ( a i + 1 ) = L O C ( a i ) + c (c为每个数据元素所占存储单元)

第i个数据元素可以由a1推出: LOC(ai)=LOC(a1)+(i1)c L O C ( a i ) = L O C ( a 1 ) + ( i − 1 ) ∗ c

数据结构知识点_第15张图片

线性表的存取时间性能为:O(1)

3.2.2 顺序存储结构的插入与删除

(1)获取元素

时间复杂度为 O(1) O ( 1 )

(2)插入

数据结构知识点_第16张图片

数据结构知识点_第17张图片

(3)删除

数据结构知识点_第18张图片

(4)时间复杂度

  • 如果插入最后一个位置,或删除最后一个位置,时间复杂度为 O(1) O ( 1 )

  • 如果插入第一个位置,或删除第一个元素,时间复杂度为 O(n) O ( n )

  • 平均的情况:插入第i个位置,或删除第i个元素,需要移动n-i个元素,根据概率原理,每个位置插入或删除可概率是相同的,所以最终平均移动次数和最中间那个元素的移动次数相等为 n1n n − 1 n ,所以时间复杂度还是 O(n) O ( n )

总结:读取的时候,复杂度为 O(1) O ( 1 ) ,插入或删除复杂度为 O(n) O ( n ) ,说明其适合元素个数不太变换,而存储操作更多的数据。

(5)线性表顺序存储结构的优缺点

数据结构知识点_第19张图片

3.3 线性表的链式存储结构

3.3.1 顺序存储结构不足的解决方法

数据结构知识点_第20张图片

3.3.2 线性表链式存储结构定义

数据结构知识点_第21张图片
数据结构知识点_第22张图片

链式结构:元素信息+后继元素的地址

结点Node:存储数据元素信息的域(数据域)+存储后继元素的地址的域(指针域)

单链表:每个结点只包含一个指针域的线性链表

数据结构知识点_第23张图片

头指针:链表第一个结点的存储位置

最后一个结点的后继不存在,即最后一个结点的指针为空(NULL)

数据结构知识点_第24张图片

头结点:第一个结点前设一个结点,可以不存储任何信息,也可以存储长度等附加信息

数据结构知识点_第25张图片

头结点与头指针的异同:

数据结构知识点_第26张图片

3.3 线性表的链式存储结构

数据结构知识点_第27张图片
带有头结点的单链表:

这里写图片描述

空链表:

这里写图片描述

设p是指向线性表第i个元素的指针,节点ai的指针域可以用p->data来表示,p->data的值是一个数据元素,节点ai的指针域可以用p->next来表示,p->next的值是一个指针,指向第i+1个元素,也就是ai+1的指针。

也就是,p->data=ai,p->next->data=ai+1

数据结构知识点_第28张图片

3.4 单链表的读取、插入与删除

1、读取
数据结构知识点_第29张图片

这里写图片描述

2、插入

数据结构知识点_第30张图片

不用改变其他结点,只需要让s->next和p->next的指针做一点改变即可

s->next=p->next;
p->next=s;

也就是让p的后继结点变为s的后继节点,再把s变为p的后继结点

数据结构知识点_第31张图片

数据结构知识点_第32张图片

3、删除

数据结构知识点_第33张图片

q=p->next;
p->next=q->next;

也就是让p的后继的后继结点,改为p的后继结点。

这里写图片描述

数据结构知识点_第34张图片

4、对比
数据结构知识点_第35张图片

3.5 单链表结构与顺序存储结构的优缺点

数据结构知识点_第36张图片

3.6 静态链表

用数组描述的链表叫做静态链表

数组的元素=两个数据域组成(数据域data+游标cur)

数组的第一个和最后一个元素作为特殊处理单元,不存数据

数据结构知识点_第37张图片

数据结构知识点_第38张图片

3.7 循环链表

单链表的终端结点的指针端原本为空指针,之后改为指向头结点,使整个单链表形成一个环,称为单循环链表,简称循环链表。

解决的问题:可以从当前一个结点出发,访问到列表的全部结点

数据结构知识点_第39张图片

3.8 循环链表

在单链表的每个结点中,再设置一个指向前驱结点的指针域,所有每个结点都有两个指针域,一个指向后继,一个指向前驱。

数据结构知识点_第40张图片

第四章 栈与队列

  • 栈是限定仅在表尾进行插入和删除操作的线性表

  • 队列是只允许在一端进行插入操作、而在另一端进行删除操作的线性表

4.1 栈的定义

栈是限定仅在表尾进行插入和删除操作的线性表

栈顶:允许插入和删除的一端
栈底:不允许任何操作
规则:先进后出(线性表)

进栈:插入
出栈:删除

数据结构知识点_第41张图片

4.2 栈的抽象数据类型

进栈:插入,push
出栈:删除(弹栈),pop

4.3 队列(queue)的定义

队列是只允许在一端进行插入操作、而在另一端进行删除操作的线性表

队列是一种先进先出的线性表(First in first out)的线性表,FIFO。

队尾:允许插入的一端
对头:允许删除的一端

这里写图片描述

第五章 串

由零个或多个字符组成的有限序列,又叫字符串

第六章 树

树是n个结点的有限集,n=0时,称为空树,在任意一颗非空树中:

  • 有且仅有一个特定的称为根的结点(Root)
  • 当n>1时,其余结点可分为m个互不相交的有限集合(T1,T2,…,Tn),其中每个集合本身又是一棵树,并且车管我根的子树(Subtree)

数据结构知识点_第42张图片

6.1 树的定义

树的结点包含一个数据元素及若干个指向其子树的分支,结点拥有的子树数量称为结点的度。

结点的分类:

  • 叶结点/终端结点:度为0的结点
  • 分支结点/非终端结点:度不为0的结点

树的度:树内各个结点的度的最大值
数据结构知识点_第43张图片

上图的树的度为3

结点间的关系:

结点的子树的根称为该结点的孩子,该结点称为孩子的双亲,同一个双亲的孩子称为兄弟,结点的祖先是从根节点到该结点所经分支上的所有结点。

数据结构知识点_第44张图片

结点的层次:

层次(Level)从根开始定义,树中结点的最大层次称为树的深度(Depth)或高度。

数据结构知识点_第45张图片

有序树:树中结点的各个子树看成是从左至右有次序的,不能互换
无序树:可以互换

数据结构知识点_第46张图片

6.2 二叉树的定义

二叉树(Binary tree)是n个结点的有限集合,该集合或者为空集(空二叉树),或者由一个根节点和两颗互不相交、分别称为根节点的左子树和右子树的二叉树组成。

数据结构知识点_第47张图片

二叉树的特点:

数据结构知识点_第48张图片

二叉树的五种形态:

数据结构知识点_第49张图片

6.2.1 特殊二叉树

1、斜树

所有结点都只有左子树的二叉树叫左斜树

所有结点都只有右子树的二叉树叫右斜树

2、满二叉树

所有分支节点都存在左子树和右子树,并且所有叶子都在同一层上的二叉树。

数据结构知识点_第50张图片
3、完全二叉树

对一棵有n个结点的二叉树按层序编号,如果编号为i的结点与同样深度的蛮二叉树中编号为i的节点在二叉树中的位置完全相同,则成全完全二叉树。
数据结构知识点_第51张图片

满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。

完全二叉树特点:

数据结构知识点_第52张图片

6.2.2 二叉树的性质

1、在二叉树的第i层,至多有 2i1 2 i − 1 个结点
数据结构知识点_第53张图片

数据结构知识点_第54张图片

2、深度为k的二叉树最多有 2k1 2 k − 1 个 结 点

数据结构知识点_第55张图片

3、对任何一棵二叉树T,如果其终端结点数为 n0 n 0 ,度为2的结点数为 n2 n 2 ,则 n0=n2+1 n 0 = n 2 + 1

数据结构知识点_第56张图片

4、具有n个结点的完全二叉树的深度为 [log2n]+1[x]x [ l o g 2 n ] + 1 ( [ x ] 表 示 不 大 于 x 的 最 大 整 数 )

数据结构知识点_第57张图片

5、对完全二叉树的任意结点i:

数据结构知识点_第58张图片

6.2.3 二叉树的存储结构

1、二叉树的顺序存储结构

用一维数组存储二叉树中的结点,并且结点的存储位置,也就是数组的下标要能体现结点之间的逻辑关系。

完全二叉树:
数据结构知识点_第59张图片

一般二叉树:

可以将其按完全二叉树来编号,不过把不存在的结点设置为空而已:

数据结构知识点_第60张图片

数据结构知识点_第61张图片
但是这样一来会对存储空间浪费,所以顺序存储结构一般只用于完全二叉树

2、二叉链表

数据结构知识点_第62张图片

data->数据域,lchile和rchile->左孩子和右孩子的指针

数据结构知识点_第63张图片

6.3 二叉树的遍历

从根节点出发,按照某种次序依次访问二叉树中所有结点,使得每个借点被访问一次,且仅被访问一次。

1、前序遍历

若二叉树为空,则空操作返回,否则先访问根节点,然后前序遍历左子树,再前序遍历右子树,下图遍历顺序为:ABDGHCEIF

数据结构知识点_第64张图片

2、中序遍历

若二叉树为空,则空操作返回,否则从根节点开始(并不访问),中序遍历左子树,然后访问根节点,最后中序遍历右子树,下图遍历顺序为:GDHBAEICF

数据结构知识点_第65张图片

3、后序遍历

若二叉树为空,则空操作返回,否则从左到右,先叶子后结点的方式遍历访问左右子树,最后访问根节点,,下图遍历顺序为:GHDBIEFCA

数据结构知识点_第66张图片

4、层序遍历

若二叉树为空,则空操作返回,否则从树的第一层,也就是根结点开始访问,从上而下逐层遍历,同一层中,按从左到右的顺序对结点逐个访问,遍历顺序为:ABCDEFGHI

数据结构知识点_第67张图片

上述四种方法其实都是在把树中的结点变成某种意义的线性序列,给程序实现带来好处。

这里写图片描述

数据结构知识点_第68张图片

6.4 树、森林、二叉树的转换

6.4.1 树转换为二叉树

数据结构知识点_第69张图片

6.4.2 森林转换为二叉树

数据结构知识点_第70张图片

6.4.3 二叉树转换为树

数据结构知识点_第71张图片

数据结构知识点_第72张图片

6.4.4 二叉树转换为森林

数据结构知识点_第73张图片

数据结构知识点_第74张图片

6.5 树与森林的遍历

数据结构知识点_第75张图片
数据结构知识点_第76张图片

6.6 哈夫曼树

数据结构知识点_第77张图片

结点的带权路径:该结点到树根之间的路径长度与结点上权的乘积

树的带权路径:树中所有结点的带权路径长度之和

哈夫曼树:带权路径长度WPL最小的二叉树,称为哈夫曼树,也叫最优二叉树

这里写图片描述
数据结构知识点_第78张图片

构造哈夫曼树的过程:

数据结构知识点_第79张图片

数据结构知识点_第80张图片

构造哈夫曼树:
数据结构知识点_第81张图片

第七章 图

7.1 图的定义

数据结构知识点_第82张图片

数据结构知识点_第83张图片

1、无向边:顶点之间没有方向,称这条边为无向边,用无序偶对 (vi,vj) ( v i , v j ) 来表示

数据结构知识点_第84张图片

2、有向边:顶点之间有方向,称这条边为有向边,也称为弧,用有序偶对 <vi,vj> < v i , v j > 来表示,如果图中任意两个顶点的边都是有向边,则称该图为有向图,要区分开弧尾vj和弧头vi

数据结构知识点_第85张图片

无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图,含有n个顶点的无向完全图有 n(n1)2 n ( n − 1 ) 2 条边。

数据结构知识点_第86张图片

有向图中,如果任意两个顶点间都存在方向互为相反的两条弧,则称为有向完全图。含有n个顶点的有向完全图有 n(n1) n ( n − 1 ) 条边。

3、连通图:无向图中,如果两个顶点之间有路径,说明两顶点是连通的,如果对于图中任意两个顶点都是连通的,则称该无向图是连通图。

数据结构知识点_第87张图片

图1不是连通图,图2是连通图

4、极大连通子图称为连通分量

数据结构知识点_第88张图片

图7-2-12的图1是一个无向非连通图,但是他有两个连通分量,即图2 和图3,而图4虽然是图1的子图,但是不满足连通子图的极大顶点数,所以不是图1的无向图的连通分量。

数据结构知识点_第89张图片

有向图中,如果对于每一对vi,vj(vi不等于vj),从vi到vj都存在路径,称其为强连通图。

数据结构知识点_第90张图片

图的定义的总结:

数据结构知识点_第91张图片

7.2 图的存储结构

图的结构比较复杂,任意两个顶点之间都可能存在联系,所以不可能用简单的顺序存储结构来表示,所以用下面的五种方法来存储图。

7.2.1 邻接矩阵

邻接矩阵的存储方式:两个数组来表示图,一个一维数组存储图中顶点的信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。

数据结构知识点_第92张图片
数据结构知识点_第93张图片

数据结构知识点_第94张图片
数据结构知识点_第95张图片

7.2.2 邻接表

临近矩阵的问题:对边数相对顶点数较少的图,这种结构是对存储空间的极大浪费,太稀疏。

数据结构知识点_第96张图片

邻接表:将数组与链表结合起来

数据结构知识点_第97张图片

数据结构知识点_第98张图片

7.2.3 十字链表

7.2.4 邻接多重表

7.2.5 边集数组

7.3 图的遍历

从图中某一顶点出发访问图中其余顶点,且使每一个顶点仅被访问一次,该过程叫图的遍历。

7.3.1 深度优先遍历(深度优先搜索Depth_First_Search,DFS)

从图中某个顶点v出发,访问此顶点,然后从v的未被访问的邻接点出发,深度优先遍历,直到图中所有和v有路径相通的顶点都被访问到。

深度优先遍历类似于树的前序遍历

这里写图片描述
数据结构知识点_第99张图片
这里写图片描述
数据结构知识点_第100张图片

7.3.2 广度优先遍历(广度优先搜索,Breadth_First_Search,BFS)

广度优先遍历类似于树的层序遍历

数据结构知识点_第101张图片

深度和广度优先遍历在时间复杂度上是一致的,没有优劣之分,只是视情况选择而已。

深度优先更适合目标比较明确,以找到目标为主的情况,广度优先更适合在不断扩大遍历访问时找到最优解的情况。

7.4 最小生成树

我们将构成连通网的最小代价生成树称为最小生成树。

7.5 最短路径

最短路径是两顶点之间经过的边上权值之和最少的路径,并且成第一个顶点是源点,最后一个顶点是终点。

1、迪杰斯特拉(Dijkstra)算法

一步步求出他们之间顶点的最短路径,过程都是基于已经求出的最短路径的基础上,求得更远顶点的最短路径。

2、弗洛伊德(Floyd)算法

数据结构知识点_第102张图片

第八章 查找

根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素。

数据结构知识点_第103张图片

静态查找和动态查找:

数据结构知识点_第104张图片

数据结构知识点_第105张图片

8.1 查找的方法

1、顺序查找

数据结构知识点_第106张图片

顺序查找的优化:

数据结构知识点_第107张图片

数据结构知识点_第108张图片

数据结构知识点_第109张图片

2、有序表查找

a、折半查找

将每次取中间记录查找的方法叫做折半查找,如果示:
数据结构知识点_第110张图片

折半查找也叫二分查找,前提是线性表中的记录必须是关键码有序(通常从小到大有序),线性表必须采用顺序存储。

折半查找的思想:在有序表中,若给定值小于中间记录的关键字,则在中间记录的左半边继续查找,若给定的值大于中间记录的关键字,则在中间记录的右半边继续查找,不断重复,直到查找成功,或查找区域无记录,查找失败为止。

数据结构知识点_第111张图片

数据结构知识点_第112张图片

数据结构知识点_第113张图片

b、插值查找

数据结构知识点_第114张图片

3、线性索引查找

8.2 二叉树排序

数据结构知识点_第115张图片
这里写图片描述

数据结构知识点_第116张图片
数据结构知识点_第117张图片

第九章 排序

数据结构知识点_第118张图片

9.1 排序的稳定性

数据结构知识点_第119张图片

内排序与外排序:

根据排序过程中,待排序记录是否全部被放置在内存中,排序分为:内排序和外排序

  • 内排序:排序过程中,待排序的所有记录全部被放置在内存中(主要介绍内排序)
  • 外排序:排序过程中,待排序的记录个数太多,不能同时放置在内存,整个排序过程需要在内外存之间多次进行数据交换才可以。

数据结构知识点_第120张图片

9.2 冒泡排序

两两比较相邻记录的关键字,如果反序则交换,如直到没有反序的记录为止。

数据结构知识点_第121张图片
数据结构知识点_第122张图片
数据结构知识点_第123张图片

冒泡排序优化:

数据结构知识点_第124张图片

数据结构知识点_第125张图片

复杂度分析:

数据结构知识点_第126张图片

9.3 简单选择排序法

通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录交换。

数据结构知识点_第127张图片

数据结构知识点_第128张图片

复杂度分析:

数据结构知识点_第129张图片

这里写图片描述

9.4 直接插入排序

将一个记录插入已经排好序的有序表中,从而得到一个新的,记录数增1的有序表。

数据结构知识点_第130张图片

数据结构知识点_第131张图片

数据结构知识点_第132张图片

复杂度分析:

数据结构知识点_第133张图片

9.5 希尔排序

突破前面的时间复杂度为O(n^2)的第一批算法之一

直接插入排序在什么时候有优势:

  • 记录本身就是基本有序的
  • 记录数量比较少时

但是上述要求在现实中过于严苛,所以希尔研究出的方法对直接插入排序改进后,可以增加效率。

希尔排序:采取跳跃分割的策略,将相距某个“增量(gap)”的记录组成一个子序列,这样才能保证在子序列内分别进行直接插入排序后的结果是基本有序的,而不是局部有序的。

数据结构知识点_第134张图片

初始序列:

这里写图片描述

第一轮:

① i=5,第1位和第5位比较,gap=4,将第5位的3和第1位的9交换了位置,变为:

这里写图片描述

② i=6,第2位和第6位比较,第二位>第六位,不交换
③i=7, 第三位和第七位比较,第三位>第七位,交换,变为

这里写图片描述

④ i=8,第四位和第八位比较,第四位>第八位,交换,变为

这里写图片描述

⑤ i=9,第五位和第九位比较,第五位>第九位,交换,变为

下标:0 1 2 3 4 5 6 7 8 9
数值:2 3 1 4 6 2 7 5 8 9

还要比较第五位和第1位的数据,最终变为2 1 4 6 3 7 5 8 9

第二轮:

① increment=4/3+1=2,i从2+1=3开始,到9结束,

数据结构知识点_第135张图片

数据结构知识点_第136张图片

9.6堆排序

这里写图片描述

数据结构知识点_第137张图片

将上图利用层序遍历存入数组,满足下列结构:

数据结构知识点_第138张图片

第一个for循环:将整个待排序序列构成一个大顶锥
第二个for循环:逐步将每个最大的值的根节点与末尾元素交换,并调整其成为大顶锥

堆排序的时间复杂度为 O(nlogn) O ( n l o g n )

9.7 归并排序

利用归并的思想实现,原理是假设初始序列含有n个记录,则可以看成n个有序的子序列,每个子序列的长度为1,然后两两归并,得到[n/2](表示除了之后的最大整数)个长度为2或1的有序子序列,再两两归并,如此重复,得到一个长度为n的有序序列为止,称为3路归并排序。

9.8 快速排序

通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。

时间/空间复杂度: O(logn) O ( l o g n )

数据结构知识点_第139张图片

数据结构知识点_第140张图片
数据结构知识点_第141张图片

你可能感兴趣的:(数据结构)