文章目录

  • 一.字符串 广义表
  • 二. 树
  • 三. 二叉树
  • 四. 图的存储结构:
  • 五.查找
  • 六.排序

一.字符串 广义表

  1. 广义表: 非空的广义表的第一个元素可以是一个元素,也可以是一个子表
    a. 求表头:广义表中的一个元素或者子表 GetHead()
    b. 求表尾:非空广义表除去表头元素以外其他元素所构成的表 表尾是一个表 GetTail()

  2. KMP算法:
    先算每个元素的next值算出来 然后右移一位 左边第一位用-1补充 右边第一位舍去 然后再给每一位数字+1

  3. F算法:一一对比 对比不成功向前前进一位继续

二. 树

  1. 树形结构:节点之间有分支 具有层次关系

  2. 树是包含n个节点的有限集合
    N=0 称为空树 树的定义是一个递归的定义

  3. 基本术语
    A. 结点:数据元素以及指向子树的分支
    B. 度: 结点拥有子树的个数
    C. 树的度:最大度数
    D. 祖先: 从根到自己经过所有的结点不包括自己
    E. 子孙:自己下面的所有孩子

  4. 深度:最大层数

  5. 有序数:树中结点的各子树从左至右有序(最左边为第一个孩子)

  6. 森林 :m棵树互不相交的树的集合

三. 二叉树

  1. 每个结点只有两个分支的树

  2. 所有的树都能唯一转化对应唯一的二叉树

  3. 二叉树也可以为空树

  4. 二叉树不是树的特殊情况 是两种不同的概念

  5. 即使只有一颗子树也要分

  6. 二叉树的抽象数据类型定义:
    数据对象:具有相同特性的数据元素的集合

  7. 特性:
    a. 二叉树上第i层上至多有2^(i-1)个结点
    b. 深度为k的二叉树至多有2^k -1个结点
    c. 对任意一颗二叉树T,如果其叶子树为n 度为2的结点为n1则 n=n1+1;

  8. 满二叉树:在顺序存储下可以复原还有完全二叉树
    除了叶子结点外所有的结点都有两个子结点
    深度为k 有2^k -1个结点
    叶子节点只能出现在最后一层(每层都是满的)
    编号 自左至右依次编号
    满二叉树在同样深度的二叉树中结点数最多
    满二叉树在同样深度的二叉树中叶子节点的个数最多

  9. 深度为k的具有n个节点的二叉树,当且仅当每一给结点都与深度为k的满二叉数中编号为1······~n的结点对应时,称之为完全二叉树

  10. 在一棵满二叉树中,从最后一个结点开始,连续去掉任意个结点,即是一颗完全二叉树

  11. 完全二叉树中:
    a. 叶子结点只可能分布在层次最大的两层上
    b. 对任一结点,如果其右子树的最大层次为i,则其左子树的最大层次必为i或i_+1;
    c. 满二叉树一定为完全二叉树 反过来不对

  12. 完全二叉树的性质:
    a. 具有n个结点的完全二叉树的深度为 {log2^n } +1;
    b. 如果对一颗有n个结点的完全二叉树

  13. 二叉树的顺序存储结构:按照满二叉树的结点层次编号,依次存放二叉树中的数据元素。

    不存在的元素但是其位置空出来
    缺点:大小固定 浪费空间 右单支浪费空间最大
    特点: 结点间关系蕴含在其存储位置中,适应于存满二叉树和完全二叉树

  14. 二叉树的链式存储结构:


    递归定义
    N个结点的二叉链表总有n个空指针域

  15. 遍历二叉树 顺着某一条搜索路径寻访二叉树中的结点,使得每个结点均被访问一次,而且仅仅被访问一次。
    遍历的目的:得到树中所有结点的一个线性排列
    遍历的用途: 是基础和核心
    先序遍历:根左右
    中序遍历:左根右
    后续遍历:左右根




    时间复杂度都一样 O(n)
    空间复杂度:O(n) 最坏情况

中序遍历 非递归的算法


16. 二叉树的层次遍历:
一层一层遍历 从上到下 从左到右

建立二叉树:

         二叉树的复制:


计算二叉树的深度:

计算二叉树的结点的总数:

计算叶子节点的数字:

17. 线索二叉树:
添加线索:
a. 如果某个节点的左孩子为空,则将空的左孩子指针域改为指向其前驱
b. 如果某结点的右孩子为空,则将空的有孩子指针域改为指向其后继
以上所说的前驱和后继是指 中序遍历中的顺序
18. 树的存储结构:
a. 双亲表示法:
实现:定义结构数组
存放书的结点
每个节点含两个域
数据域:存放书的结点
双亲域:只是本届点的双亲结点在数组中的位置

特点:找双亲容易,找孩子南

19. 孩子链表:把每一个结点排列起来,看成是一个线性表,用单链表存起来,则n个结点有n个孩子链表(叶子结点的链表为空表)


特点:找孩子容易 找双亲难
20. 孩子兄弟表示法:
实现:用二叉链表作树的存储结构,链表中的每一个结点的两个指针域分别指向第一个孩子结点和下一个兄弟结点


21. 树和森林
树转化为二叉树
给定一颗树,可以找到唯一的一颗二叉树与之对应
a. 加线 :在兄弟结点之间加上一条线
b. 擦线:对每个结点,除了其左孩子外,去除其与其余孩子之间的关系
c. 旋转:以树的跟姐顶啊为轴心,将整数顺时针旋转45度
树变二叉树:兄弟相连留长子
二叉树转化为树;
a. 加线:若p结点是双亲节点的左孩子,则将p的右孩子 右孩子的右孩子。。。。。。。沿分支找到所有右孩子,都与p的双亲用线连起来
b. 擦线:擦掉原二叉树中双亲与右孩子之间的连线
c. 调整:将节点按照层次排序,形成树结构
左孩右右连双亲
去掉原来右孩线
22. 森林转化为二叉树:
a. 将各课树分别转换为二叉树
b. 将每棵树的根节点用线相连
c. 以每一棵树跟节点为二叉树的根,再以跟几点为轴心,顺时针旋转,构成二叉树型结构
树变二叉根相连
23. 二叉树转换森林:
a. 擦线:将二叉树中根节点与其右孩子连线,及沿右分支搜索到所有右孩子间连线全部抹掉,使之变成孤立的二叉树
b. 还原:将孤立的二叉树还原成树
去掉全部右孩子线,孤立二叉在还原
24. 树的遍历(三种遍历)
a. 先根遍历: 若树不空,则先访问根节点,然后依次先根遍历各课子树
b. 后根遍历:若树不空,则先依次后跟遍历各课子树,然后访问根节点
c. 层次遍历:若树不空,则自上而下自左至右访问树中每个节点
25. 哈夫曼树和应用:
也称最优二叉树
(1) 树的路径长度:从树根到每一个节点的路径长度之和。记作:TL
(2) 权重:将树中节点赋给一个数值,这个数值称为该点的权
(3) 结点的带权路径长度:
从根结点到该点之间的路径长度与该点的权的乘机
(4) 树的带权路径长度:树中所有叶子节点的带权路径长度之和

哈夫曼树:最优树 带权路径长度最短的树
满二叉树不一定是哈夫曼树
哈夫曼树不一定唯一
具有相同带权结点的哈夫曼树不唯一
哈夫曼树中权值越大的叶子离根越近
贪心算法:哈夫曼树中权越大的叶子离根越近
26. 哈夫曼算法

哈夫曼树的结点的度数为0或2 没有1
哈夫曼树中有2n-1个结点 n为元素个数
新产生的n-1个新结点 都是具有两个度的结点
27. 哈夫曼树构造算法的实现
采用书匈奴存储结构—一维结构数组



哈夫曼编码:
在远程通讯中,要将代传字符转换成二进制字符串
左:0
右:1
哈夫曼编码是前缀编码
哈夫曼编码能够保证字符编码总长度最短
哈夫曼编码是最优编码
哈夫曼编码的代码实现

28. 图的逻辑结构:多对多
多对多 G=(V,E)
V: 顶点的有穷非空集合
E:边的集合
无向图:每条边都是无方向的
有向图:每条边都是有方向的
完全图:任意两个都有一条边相连
无向完全图:边数 n(n-1)/2
有向完全图:边数 n(n-1)
稀疏图:又很少边或弧的图
稠密图:有较多边或弧的图
网:边或弧带权的图
邻接:有边或者弧相连的两个顶点之间的关系
关联(依附):边/弧与顶点之间的关系
顶点的度:与该顶点相关联的边的数目
在有向图中,顶点的度等于该顶点的入度和出度之和
路径:接续的边构成的顶点序列
路径的长度:路径上边或弧的数目/权值之和
回路(环):第一个顶点和最后一个顶点相同的路径
简单路径:除路径起点和终点可以相同外,其余顶点均不相同的路径
简单回路:除路径起点和终点相同外,其余顶点均不相同的路径
连通图:
在无向图中如果任意两个顶点之间都存在路径那么就称为连通图
强连通图:(可以跨顶点)
在有向图中任意两个顶点都存在路径那么就称为强连通图 (可以跨顶点)
权和网:
图中的边或弧所具有的相关树称为权
带权的图称作网
连通分量:
无向图G的极大联通子图称为G的连通分量
有向图中称为 强连通分量:
极大联通子图的意思是:该子图的G联通子图,将G的任何不再该子图中的顶点加入子图不再联通
极小连通子图:该子图是G的连通子图,在该子图中删除任何一条边子图不再联通
生成树:包含无向图G所有顶点的极小连通子图
生成森林:对非连通图,由各个联通分量的生成树的集合
29. 图的抽象类型定义

四. 图的存储结构:

多对多
数组表示法(邻接矩阵)
图没有顺序存储结构
但是可以借助二维数组来表示元素之间的关系
链式存储结构 :
多重链表:邻接表 邻接多重表 十字链表
邻接矩阵:

无向图的邻接矩阵是 对称矩阵 主对角线元素为0
第i个元素的度列或行的个数
又向图的邻接矩阵:
第i行的含义:以节点Vi为尾的弧(出渡边)
第j列含义:以结点vj为首的弧(入渡边)
有向图的邻接矩阵可能是不对称的
顶点的出度=行元素之和
网的邻接矩阵的表示法:
将权值代替1即可
31. 邻接矩阵的存储表示:用两个数组分别存储顶点表和邻接矩阵

采用邻接矩阵表示法创建无向网
算法思想:
输入总顶点数和总边数
依次输入点的信息存入顶点表中
初始化邻接矩阵,使得每个权值初始化为极大值
构造邻接矩阵

邻接矩阵的好处:

  1. 直观简单好理解
  2. 方便检查任意一对顶点间是否存在边
  3. 方便找出任一顶点的所有“”临界点”
  4. 方便计算任意顶点的度
    无向图:对应行或列的非0元素的个数
    又向图:对应行非0元素的个数是出度
    对应列非0元素的个数是入度
    缺点:空间复杂度 0(n^2)
    不便于增加和删除顶点
    浪费空间
    浪费时间
  5. 图的链式存储结构
    (1)

    若无向图中有n个顶点 e条边 则其邻接表需要n个头结点和2e个表结点,适宜存储稀疏图
    无向图中顶点Vi的度为第i个单链表中的结点数

(2) 有向图的邻接表:
存储空间是n+e个空间
出度:根节点的个数


对于任意确定的无向图,邻接矩阵是唯一的。但是邻接表不唯一
邻接矩阵 的空间复杂度死o(n^2)而邻接表的空间复杂度O(n+e)
用途:邻接矩阵多用于稠密图,而邻接表多用于稀疏图


33. 十字链表:
主要是存储有向图


34. 图的遍历
从已给的连通图中某一定点出发,沿着一些边访问图章所有的顶点,且每个顶点仅仅被访问一次
图的深度优先遍历(DFS):
一条道走到黑
① 在访问图中某一起始点V后,由V出发,访问它的任一邻接点W1
② 再从W1出发 访问W1的邻接但还未被访问过的顶点W2
③ 然后从w2出发继续操作
④ 如此进行下去,直至达到所有的邻接顶点都被访问过
⑤ 重复上述操作,直到连通图的所有顶点都被访问过为止
连通图中深度优先遍历不唯一

DFS的算法效率:
邻接矩阵时间复杂度是O(n^2)
邻接表时间复杂度是O(n+e)
结论:稠密图适于在邻接矩阵上进行深度优先遍历
稀疏图适于在邻接表上进行深度优先遍历
图的广度优先遍历(BFS):
方法:从图的某一节点出发,首先一次访问该节点的所有邻接点,再按这些顶点被访问的先后次序依次访问与他们相邻接的所有被访问的顶点
广度优先遍历算法效率 :
邻接矩阵O(n^2)
邻接表:O(n+e)
深度优先遍历和深度优先遍历的算法比较:
空间复杂度相同,都是O(n)借用了堆栈或队列
时间复杂度只与存储结构(邻接局怎或邻接表)有关,而与搜索路径无关
邻接矩阵是O(n^2)
邻接表是O(n+e)

  1. 最小生成树:
    生成树:所有顶点均由边连接在一起,但不存在回路的图

    连通所有顶点但是无回路
    一个图可以有许多可不同的生成树
    所有生成树具有:
    a. 生成树的顶点个数与图的顶点个数相同
    b. 生成树是图的极小连通子图
    c. 一个有N个顶点的连通图的生成树有n-1条边
    d. 再生成树种再加一条边必然形成回路
    e. 生成树中任意两个顶点的路径唯一的

    最小代价生成树 无向网中各边权值最小的生成树
  2. 构造最小生成树:
    从初始顶点开始选择最小权值的边 这条边必存在于某个生成树当中
    但是不能存在回路
    Prim算法:
    找最小权值 拉进最小生成树中 再找 再拉


不能存在回路
克鲁斯卡尔算法:贪心算法
算法思想:先把所有顶点加到最小生成树当中
将所以的边都进行排序 然后选择最小的但是不能存在回路


37. 最短路径:
起点到终点选择最小的路径
不用包含所有的顶点
① 两点间的最短路径 迪杰斯特拉算法
② 某源点到其他各点的最短路径 弗洛伊德算法
(1) 迪杰斯特拉算法:
① 先找出从源点到各终点的直达路径
② 从这些路径中找出一条长度最短的路径
③ 然后对其余各路径进行适当调整
每次找源点到其他各点的所有路径到达不了的记为无穷
然后找最小的 然后进行调整 再找最小的


(2) 所有顶点间的最短路径
方法一:每次以一个顶点为原点,重复执行迪杰斯特拉算法 nci
方法二:弗洛伊德算法
算法思想:
逐个顶点进行试探
从vi—vj的所有可能存在的路径中
选择一条长度最短的
方法:求最短路径的步骤:
初始时设置一个n阶方阵 零度角线元素为0,若存在弧则对应元素的权值
逐步试着在原直接路径增加中间顶点后路径变短,则修改,所有试探完毕算法结束

两者的复杂度差不多,但是可以看出弗洛伊德算法的思想就是通过遍历周围的点,用这些点作为中继去更新起始点到其它点的距离。
而迪杰斯特拉算法的思想是找到距离已更新的点们最近的那个点,用那个点去更新其它点。
两者都是找中继点,不同的是弗洛伊德算法是遍历,而迪杰斯特拉算法是先找到最近点。所以在代码上弗洛伊德算法会简洁一些
38. 有向无环图(DAG):
AOV网():用一个有向图表示一个工程的个子工程及其相互制约的关系,其中顶点表示活动,弧表示活动之间的优先制约关系
从i到j有一条又向路径,则i是j的前驱,j是i的后继
AOV网中不允许有回路
拓扑排序的方法:
在AOV网没有回路的前提下,我们将全部活动排列成一个线性序列,使得若AOV网中有弧<I,j>存在,则这个序列中,i一定排在前面具有这种性质的线性序列称为拓扑有序序列,相应的拓扑排序的排序算法称为拓扑排序
① 在有向图中选择一个没有前驱的顶点且输出
② 从图中删除该顶点和所有以他为尾的弧
③ 重复以上操作
拓扑排序不唯一

AOE网(关键路径):用一个有向图表示一个工程的各子工程及其相互制约的关系,以弧表示活动,以顶点表示活动的开始或结束事件,称这种有向图为边表示活动的网,简称AOE网
关键路径——路径长度最长的路径
路径长度——路径上各种活动持续时间最长
关键路径的计算方法:
Ve(vj)—表示事件vj的最早发声时间
VL(vj)——表示事件vj的最迟发生时间
E(i)表示活动ai的最早开始时间
L(i)表示活动ai的最迟开始时间
L(i)-e(i)—表示完成活动ai的时间余量
关键活动——关键路径上的活动l(i)==e(i)

如何找l(i)==e(i)的关键活动:??

E(i)的最早开始时间:依附于弧尾的结点的最早发生时间
L(i) 的最晚发生时间:顶点的最晚发生时间-权值

如何求ve(j) 和 vl(j)??

上一个顶点的最早发声时间+持续时间选取最大的 即为顶点的最早发生时间
弧头 最晚发生时间-权值 找一个最小的

V事件 ve vl
最早发声时间:弧尾+最大权值 选最大
最迟发生时间:弧头-最大权值 选最小
E(i) l(i) 活动
E(i) 最早发生时间=前面结点的最早发生时间 e(i)=ve(j)
L(i) 最晚发生时间=vl(k)-wj,k 弧头结点的最晚发生时间-权值

没有时间余量的是关键活动
由关键活动组成的路径就是关键路径

若网中有几条关键路径,则需加快同事在几条关键路径上的关键活动
如果一个活动处于所有的关键路径上,那么提高这个活动的速度,就可以缩短整个工程的完成时间
处于所有关键路径上的活动完成时间不能缩短太多,否则会使原来的关键路径变成不是关键路径

五.查找

查找表中查找
查找表是由同一类型的数据元素(或记录)构成的集合,由于“”集合“的数据元素之间存在着松散的关系 顺序无关
根据给定的某个值,在查找表中确定一个其关键字等于给定的数据元素
关键字:用来表示一个数据元素的某个数据项的值
主关键字:只能找到唯一的
次关键字:找到多条数据
只做查询和检索静态查找表
动态查找表:进行修改

关键字的平均比较次数 也成为了品骏查找长度
ASL
在线性表上的查找:
顺序查找:
① 顺序表或线性链表表示的静态查找表
② 表内元素无序

④ 查找的方法:
一一对比 从前面或者后面都可以
改进:把待查关键字key存在表头(“哨兵”)从最后一个进行查找 恶意免去查找中每一次检测是否查找完毕,加快速度
⑤ 时间效率分析:时间效率与查找的位置有关 (n+1)/2
⑥ 空间复杂度O(1)
⑦ 提高效率:
a. 按照查找概率高低存储
b. 按照查找概率动态调整记录顺序
⑧ 优点: 算法简单逻辑次序无要求 且不同存储结构均适用
⑨ 缺点’: 时间效率太低
折半查找:
① 每次将待查找记录所在的区间缩小一半
② Mid=(low+high)/2
③ Key<mid 在前半区找high=mid-1
④ Key>mid 在后半区找low=mid+1
⑤ 找到 mid=key
⑥ High<low 结束条件

递归:


比较次数与层数有关
⑩ 比较次数=路径上的结点数=层次
⑪ 比较次数<=树的深度log2^n +1
⑫ 查找不成功:比较次数=路径的nebula结点数 比较次数<=log2^n +1


⑭ 折半查找优点:效率比顺序查找高
⑮ 折半查找缺点:只适合于有序表,且限于顺序存储结构(对线性表无效)
分块查找:
① 条件:将快分成几块,且表或者有序 或者分块有序 块间有序块内无序
② 建立索引表 每个节点含有最大关键字和指向本快第一个节点的指针,且安关键字有序
③ 查找过程 先确定待查记录 所在块(顺序或者折半查找)再到块内查找
④ 查找效率:ASL=Lb+Lw


40. 二叉排序树
又称为二叉搜索树,二叉查找树
二叉排序树或是空树,或者满足如下性质
a. 其左子树非空 则左子树上所有节点的值均小于跟节点的值
b. 右子树非空,右子树上的所有接地那的值均大于等于跟节点的值
c. 其左右子树本身又是一颗二叉排序树





比较的关键字的次数=此结点所在的层次数=最多的比价次数=树的深度



二叉排序树的操作:
生成————从空树出发 经过一系列的查找,插入操作之后,可生成一颗二叉排序树
第一个节点为根节点
二叉排序树的中序遍历就是有序的

关键字的输入顺序不同 则二叉树的构造也不同
二叉排序树的删除操作
① 用左子树代替删除节点
② 用右字数代替删除节点
③ 用左子树的最大值代替删除节点
④ 用右子树的最小值代替删除节点
41. 平衡二叉树:
又称AVL树
一颗平衡二叉树或是空树或是满足:
左子树与右子树的高度之差的绝对值小于等于1
左子树和右子树也是平衡二叉树
平衡因子:
平衡因子=结点左子树的高度-结点的右子树的高度
42. 散列表的查找:
散列表记录的存储位置与关键字之间存在对应关系
对应关系—hash函数
优点:查找效率高‘
缺点:空间效率低

散列方法:选取某个函数依该函数按关键字计算元素的存储位置
查找时,由同一个函数对给定K计算地址,将k与地址单元中元素关键码进行比,确定查找是否成功
散列函数(杂凑函数)散列方法中适用的转换函数’

构造好的散列函数
① 所选的函数尽可能简单,以便提高转换的速度
② 所选函数对关键码计算出位置,应在散列地址集中均匀分布,以减少空间浪费
制定一个好的解决冲突的方案
① 查找时,如果从散列函数计算出的地址查找不到关键码,则应当依据解决冲突的规则,有规律的查询其他相关单元
构造散列函数考虑的因素
① 执行速度
② 关键字的长度
③ 散列表的大小
④ 关键字的分布情况
⑤ 查找频率

直接定制法:

除留余数法:

开放定地址发:
基本思想:有冲突的时候就寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将数据元素存入


线性探测法: 冲突就往下一个位置走 直到走到空位置
二次探测法:

链地址法:

优点:非同义词不会冲突
无聚集现象

六.排序

排序:将一组杂乱无章的数据按照一定对顺次排列起来


43. 插入排序:
基本思想: 每一步都是讲一个待排序的对象,按其关键码的大小,插入到前面已经排好序的对象的适当的位置上,直到对象全部插入为止
即:边插边排序,保证子序列中随时都会排好序的

直接插入排序:
采用顺序查找插入位置
复制插入元素
记录后移,查找插入的位置
插入到正确的位置即可
直接插入排序 使用哨兵
① 复制为哨兵
② 记录后移,查找插入位置
③ 插入到正确的位置


实现排序的基本操作:
“比较”序列总两个 关键字的大小
移动记录
最好的情况(关键字在记录序列中顺序有序)
比较次数 n-1次
移动的次数:0次
最坏的情况(关键字在记录中逆序)
比较次数 (n+2)(n-1)/2
移动的次数 (n+4)(n-1))/2
直接插入排序数据越接近有序,排序速度越快

44. 折半插入排序

折半查找比顺序查找块,所以折半插入排序就平均性能来说比直接插入排序要快
他所需要的关键码比较次数与待排序对象序列的初始排列无关,仅仅依赖于对象的个数,在插入第i个元素,需要经过log2^I +1 关键码比较才能确定他应插入的位置
当n比较大时,总关键码比较次数比直接插入排序的最坏情况好的多,但比最好情况差
比较次数与关键字的大小无关 只与n有关
移动的次数与直接插入排序的次数基本一样


45. 希尔排序:
将整个待排序的序列分割成若干个子序列,分别进行插入排序待整个序列中的记录基本有序,在对全体记录进行一次直接插入排序
希尔排序的算法特点:
缩小增量
多遍插入排序
特点:
一次移动,移动位置较大,跳跃式的接近排序后的最终位置
最后一次只需少量的移动
增量序列必须是递减的 最有一个必须是1
增量序列应该是互质的

希尔排序的算法效率与增量序列的取值有关


希尔排序是一种不稳定的排序算法
最后一个增量 值必须为1 无除一以外的公因子
不宜在链式存储结构上实现


46. 基于交换的排序
两两比较 如果发生逆序则交换,直到所有记录都排好序为止
常见的交换排序:
冒泡排序 O(n^2)
快速排序 O(n log2^n)
① 冒泡排序
每趟都会增加一个有序元素
N个记录,总共需要n-i次 i为趟数

每趟结束时,不仅能寄出一个最大值到最后 ,而且能使前面的基本进行
整理
时间复杂度:
最好(正序)
比较次数:n-1
移动次数 0
最坏情况(逆序)
比较1/2(n^2-n)
移动次数:

② 快速排序:
基本思想:
任取一个元素(如第一个)为中心
所有比它小的元素一律前方,比他大的元素一律后方
形成左右两个字表
对各子表重新选择中心元素并以此规则矫正
直到每个子表的元素只剩一个
基本思想:通过一趟排序,将待排序记录分割成独立的两部分,
选择数字:任意一个就行
每次找中心点 小的放前面 大的放后面


快速排序的时间复杂度
O(nlog2^n)
就平均而言,快速排序是我们所讨论的所有内排序的方法中最好的一个
快速排序空间复杂度: 需要O(log2^n)的栈空间
栈空间需要O(N)最坏
稳定性:不稳定
快速排序不适于对原本有序的或基本有序的记录序列进行排序


47. 选择排序
基本思想
在待排序的数据中选出最大的或者最小的元素放在最终的位置

需要n-1趟
时间复杂度:
记录移动次数
最好情况: 0
最坏情况3(N-1)
简单选择排序不是稳定排序
48. 堆排序:
堆得定义可以看出,堆得实质是满足如下性质的完全二叉树
二叉树中任一非叶子结点均小于或者大于它的孩子
小根堆:叶子结点比根大
大根堆:叶子结点比根小
堆排序也是不稳定的排序方法
时间复杂度O(logn^2)
49. 归并排序:
基本思想:将两个或两个以上的有序子序列归并为一个有序序列


50. 基数排序:
基本思想:
也叫桶排序或箱排序 设置若干个箱子,将关键字K的记录放入第k个箱子
然后再按序号将非空的连接
基数排序:数字是有范围的,均由0—9这十个数字组成,则只需设置十个箱子,相继按个 十 百进行即可




数据结构(本科学习)相关推荐

  1. ES6基础4(数据结构)-学习笔记

    文章目录 ES6基础4(数据结构)-学习笔记 set map symbol ES6基础4(数据结构)-学习笔记 set //set 数据结构 类似数组 成员信息唯一性var s = new Set() ...

  2. 数据结构专题-学习笔记:李超线段树

    数据结构专题 - 学习笔记:李超线段树 1. 前言 2. 详解 3. 应用 4. 总结 5. 参考资料 1. 前言 本篇博文是博主学习李超线段树的学习笔记. 2020/12/21 的时候我在 线段树算 ...

  3. 南京邮电大学811《数据结构》学习之路

    大学物联网工程专业,没有计组.计网.微原和通原的我,不知道怎么在这个交叉学科中活下去(学校优秀,认为随着政策的利好,学生都有工作课程随意点).认认真真考研,开始更新南京邮电大学811<数据结构& ...

  4. 《数据结构》学习笔记一:绪论

    个人看法: 数据结构的重要性对于码农而言就像盖房子的图纸,做饭的菜谱,没有它,也许也能盖得成房子,也能做的熟菜,但是质量如何就不敢说了.我们从大学的时候就把<数据结构>作为重要的基础课程来 ...

  5. 报名本科学习了,又报考了研究生考试了!!

       今天下午到电大报了名准备参加远程培训学习,争取本科在两年内念完吧!现在又报了年底的研究生考试,希望能取得一个好成绩吧!! 转载于:https://blog.51cto.com/60955/615 ...

  6. 数据结构+算法 学习计划与资源

    学了很多杂乱的技术,继续成长 渐感吃力,重新学习数据结构 与 算法. 计划: 1.严蔚敏<数据结构><大话数据结构>,每天一个小例子. 2.采用C++ 或者C .尽量用C++实 ...

  7. python的基本数据结构_Python学习笔记——基本数据结构

    列表list List是python的一个内置动态数组对象,它的基本使用方式如下: shoplist = ['apple', 'mango', 'carrot', 'banana'] print 'I ...

  8. python的基本数据结构_python学习笔记-基本数据结构

    Python 学习笔记-1 写在最前面,因为组内小伙伴要走,生信团队由原来的7个人,慢慢的变的只有我一个人了,需要紧急突击下python,因为有python的流程要交接维护 python 基本情况 代 ...

  9. 别头疼了,你要的算法和数据结构的学习路线来了!

    随着科学技术的发展,人工智能已经逐渐渗透到各个行业,这是一个相当有前景的专业领域. 其中,算法工程师这一职位更是非常火爆,在急缺大量人才的同时,也吸引了众多求职者,那么,初学者该如何学好算法呢? 算法 ...

最新文章

  1. jdk 环境配量配置
  2. CentOS 7下源码编译安装新版本内核
  3. Java后台 自动 翻页查询
  4. 给一个金额字符串插入逗号分隔 保留两位有效数字
  5. 重写、重载方法的调用
  6. setTimeout setInterval
  7. HDU4099(斐波那契数列与字典树)
  8. android实现自动横竖屏切换,android 中实现横竖屏切换【原创】
  9. android 系统 (103)---系统memory使用状况
  10. AndroidStudio_安卓原生开发_拍照存储在Uri中_利用图片后通过Uri获取文件真实路径_然后删除---Android原生开发工作笔记161
  11. Linux常用命令——关机重启命令
  12. Mysql索引之-cardinality
  13. tomcat 虚拟目录与显示目录中文件列表
  14. vb.net中如何结束一个线程
  15. 3dmax加载las数据
  16. Python修改证件照底色,get新技能
  17. 宝塔自动备份网站到FTP空间
  18. matlab gif生成器,matlab制作及生成avi,gif动画
  19. web前端期末大作业:基于HTML+CSS+JavaScript奥迪企业bootstrap响应式网站
  20. 机器学习中的范数理解(L0,L1,L2)

热门文章

  1. 2021年中国给水泵市场趋势报告、技术动态创新及2027年市场预测
  2. UVA10142/PC110108Australian Voting
  3. 华为数据管理与分析课程
  4. 微信小程序提示:https://api.map.baidu.com 不在以下 request 合法域名列表中
  5. C++将小数化成分数
  6. Ubuntu 20.04 -中文输入法-fcitx-connection failed [ip:91.189.91.38 80]
  7. 旅游类小程序源码在哪下载?
  8. 鼠标拖拽盒子跟着鼠标在页面任意位置移动
  9. 鲁宾逊微积分与“知识共享”,携手相伴进入中国
  10. 高尔顿与回归分析的起源