数据结构C语言版----第09章
《数据结构C语言版》----第09章
遍历DepthFirstSearch(G) (8)遍历DepthFirstSearch(G) 9.2 图的存储结构 图的存储结构主要有邻接矩阵和邻接表两种。 图的存储结构主要有邻接矩阵和 邻接表两种。 邻接矩阵和邻接表两种 1.图的邻接矩阵存储结构 1.图的邻接矩阵存储结构 假设图G=(V,E)有n个顶点,即V={v0,v1,…,vn-1},E可用如下 假设图 有 个顶 点, , 可用如下 个顶点 形式的矩阵A描述 对于A中的每一个元素 描述, 中的每一 个元素a 满足: 形式的矩阵 描述,对于 中的每一个元素 ij,满足: 1 aij = ? ? 0 若(vi , v j ) ∈ E或 < vi , v j >∈ E 否则 由于矩阵A中的元素 表示了顶点 和顶点vj之间边的关系 由于矩阵 中的元素ai j表示了顶点 和顶点 之间边的关系, 中的元素 表示了顶点vi和顶点 之间边的关系 , 或者说, 中的元素 表示了顶点vi和顶点 中的元素aij表示了顶点 和顶点vj( 或 者说,A中的元素 表示了顶点 和顶点 (0≤j≤n-1)的 ) 邻接关系,所以矩阵A称 作邻接矩阵 称作邻接矩阵。 邻接关系,所以矩阵 称作邻接矩阵。 无向图的邻接矩阵一定是对称矩阵 2 1 4 3 (a) 5 1? ?2? ? ? V = ?3? ? ? ?4? ?5? ? ? (b) 0 ?1 ? A = ?1 ? ?1 ?1 ? 1 1 1 1? 0 0 1 0? ? 0 0 0 1? ? 1 0 0 0? 0 1 0 0? ? 有向图的邻接矩阵一般是非对称矩阵 B A D C (a) E A? ?B? ? ? V = ?C ? ? ? ?D? ?E? ? ? (b) 0 ?0 ? A = ?0 ? ?0 ?0 ? 1 1 1 1? 0 0 0 0? ? 0 0 0 1? ? 1 0 0 0? 0 0 0 0? ? 其中V表示了图的顶点集合, 表示了图的邻接矩阵 其中 表示了图的顶点集合, A表示了图的邻接矩阵 表示了图的顶点集合 带权图及其邻接矩阵 2 20 1 30 3 50 6 40 4 80 70 5 1? ? 2? ? ? ? 3? V =? ? ? 4? ?5 ? ? ? ?6 ? ? ? 0 20 30 ∞ ∞ ∞ ? ?20 0 ∞ 40 ∞ ∞ ? ? ? ?30 ∞ 0 50 ∞ ∞ ? A=? ? ∞ 40 50 0 70 80? ? ? ∞ ∞ ∞ 70 0 ∞ ? ? ? ? ∞ ∞ ∞ 80 ∞ 0 ? ? ? (b) (a) 其中V表示了图的顶点集合, 表示了图的邻接矩阵 表示了图的邻接矩阵。 其中 表示了图的顶点集合,A表示了图的邻接矩阵。 对于 表示了图的顶点集合 带权图, 邻接矩阵第i行中所有 带权图,邻接矩阵第 行中所有0的权值 ij。 的权值w 的权值 问题: 邻接表存储结构和数组一章中的什么存储结构类似? 问题 : 邻接表存储结 构和数组一章中的什么存储结构类似 ? 9.3 图的实现 1.邻接矩阵存储结构下图操作的实现 1.邻接矩阵存储结构下图操作的实现 #include "SeqList.h" typedef struct { SeqList Vertices; int edge[MaxV ertices][MaxVertices]; int numOfEdges; }AdjMGraph; void Initiate(AdjMGraph *G, int n) { int i, j; for(i = 0; i < n; i++) for(j = 0; j < n; j++) { if(i == j) G->edge[i][j] = 0; else G->edge[i][j]
数据结构(c语言版)题集答案——第九章_查找
*;
;
*;
} ;
{
*;
;
} ;供查找地双向循环链表类型
*( )在有序双向循环链表存储结构上地查找算法,假定每次查找都成功文档来自于网络搜索
{
;
(>>)
{
(>>) >;
;
}
(>{
(>;
;
}
;
}
分析:本题地平均查找长度与上一题相同,也是.
;
( )判断二叉树是否二叉排序树,是则返回,否则返回
{
(>) (>);
{
;
()沿分支向下查找
{
(>>[]);确定关键字所在子树
(>) ;关键字太大
>[];
}
(>[]);在叶子结点中查找
(>) ;找不到关键字
;
;
}
( )在树中插入字符串地结构见第四章文档来自于网络搜索
{
(*)(());
>;
>;建叶子结点
[];
;
(<>[([])])
{
;
>[([])];
;
}自上而下查找
(>)如果最后落到分支结点(无同义词):
(>>>)其余部分与上一题同
{
(>) >;
(>);
}
(>)
{
(>) >;
(>);
}
>;
>;
}
{
;
;
;域表示该结点地左子树地结点总数加
*,*;
} ,*;含域地平衡二叉排序树类型
数据结构(C语言版)习题及答案第九章
数据结构(C语言版)习题及答案第九章数据结构(C语言版)习题及答案习题一、选择题1、一组记录的排序码为(46,79,56,38,40,84),则利用堆排序的方法建立的初始堆为( B )。
A、79,46,56,38,40,80B、84,79,56,38,40,46C、84,79,56,46,40,38D、84,56,79,40,46,382、排序趟数与序列原始状态(原始排列)有关的排序方法是(ACD )方法。
A、插入排序B、选择排序C、冒泡排序D、快速排序3 、下列排序方法中,(B )是稳定的排序方法。
A、直接选择排序B、二分法插入排序C、希尔排序D、快速排序4、数据序列(8,9,10,4,5,6,20,1,2)只能是下列排序算法中( C )的两趟排序后的结果。
A、选择排序B、冒泡排序C、插入排序D、堆排序5、对序列(15,9,7,8,20,-1,4)进行排序,进行一趟排序后,数据的排列变为(4,9,-1,8,20,7,15),则采用的是(C )排序。
A、选择B、快速C、希尔D、冒泡6 、一组待排序记录的关键字为(46,79,56,38,40,84),则利用快速排序,以第一个记录为基准元素得到的一次划分结果为(C )。
A、(38,40,46,56,79,84)B、(40,38,46,79,56,84)C、(40,38,46,56,79,84)D、(40,38,46,84,56,79)7、用直接插入排序对下面四个序列进行排序(由小到大),元素比较次数最少的是(C )。
A、94,32,40,90,80,46,21,69B、32,40,21,46,69,94,90,80C、21,32,46,40,80,69,90,94D、90,69,80,46,21,32,94,408、若用冒泡排序对关键字序列(18,16,14,12,10,8)进行从小到大的排序,所需进行的关键字比较总次数是(B )。
A、10B、15C、21D、349、就排序算法所用的辅助空间而言,堆排序、快速排序和归并排序的关系( A )。
C语言程序(第四版)(谭浩强编)教程-第9章_用户自己建立数据类型
#include <stdio.h> int main() {struct Student { long int num; char name[20]; char sex; char addr[20]; }a={10101,“Li Lin”,„M‟, “123 Beijing Road”}; a.num=10010; 对
9.2 使用结构体数组
9.2.1定义结构体数组
9.2.2 结构体数组的应用举例
9.2.1定义结构体数组
例9.3 有3个候选人,每个选民只能 投票选一人,要求编一个统计选票的 程序,先后输入被选人的名字,最后 输出各人得票结果。
9.2.1定义结构体数组
解题思路:
设一个结构体数组,数组中包含3个元素
3. 不指定类型名而直接定义结构体类型变量
其一般形式为:
struct
{ 成员表列 }变量名表列;
指定了一个无名的结构体类型 。
9.1.2 定义结构体类型变量
(1) 结构体类型与结构体变量是不同的概 念,不要混同。只能对变量赋值、存取 或运算,而不能对一个类型赋值、存取 或运算。在编译时,对类型是不分配空 间的,只对变量分配空间。
#include <stdio.h> int main() {struct Student { long int num; char name[20]; char sex; char addr[20]; }a={10101,“Li Lin”,„M‟, { } “123 Beijing Road”}; printf("NO.:%ld\nname:%s\n sex:%c\naddress:%s\n", a.num,,a.sex,a.addr); return 0; }
数据结构与算法(C++语言版)》第9章 内部排序
插入排序
插入排序
• 以上述静态链表类型作为待排记录序列的存储结构,并设 数组中下标为0的分量为表头结点,并令表头结点记录的关 键码取最大整数MAXNUM。 • 表插入的排序过程是,首先将静态链表中数组下标为1的分 量(结点)和表头结点构成一个循环链表,然后依次将下 标为2~n的分量(结点)按记录关键码非递减有序插入到 循环链表中,算法如以下程序所示。
插入排序
例9-3
• 以关键码序列{52, 43, 68, 89, 77, 16, 24, 52*, 80, 31}为例,表 插入排序的过程如下列图所示。
插入排序
• 从上面的过程可看出,表插入排序与直接插入排序的不同 之处在于,表插入排序以修改2n次指针值来代替记录的移 动,但和关键码的比较次数相同,因此表插入排序的时间 复杂度仍为O(n2)。
i=n
交换排序
• 快速排序 • 快速排序(quick sort)是Hoare于1962年提出的一种分区交 换排序。它采用了一种分而治之的策略,是对冒泡排序的 一种改进。其算法思想是,首先将待排序记录序列中的所 有记录作为当前待排序区域,选取第一个记录的关键码值 为基准(轴值),从待排序记录序列左、右两端开始向中 间靠拢,交替与轴值进行比较,若左侧记录的关键码值大 于轴值,则将该记录移到基准记录的右侧,若右侧记录的 关键码值小于轴值,则将该记录移到基准记录的左侧,最 后让基准记录到达它的最终位置,此时,基准记录将待排 序记录分成了左右两个区域,位于基准记录左侧的记录都 小于或等于轴值,位于基准记录右侧的所有记录的关键码 都大于或等于轴值,这就是一趟快速排序。
例9-5
• 如图所示为冒泡排序的一个示例。冒泡排序的效率分析: ① 若初始序列为“正序”序列,则只需进行一趟排序,在 排序过程中进行n−1次关键码的比较,且不移动记录;② 若 初始序列为“逆序”序列,则需进行n−1趟排序,需进行 2 ∑ (i − 1) = n(n − 1) / 2次比较。因此,总的时间复杂度为O(n2)。
数据结构-C语言描述(第二版)(耿国华)章 (9)
第9章 内部排序
我们知道, 在进行直接插入排序时, 若待排序记录序 列已经有序时, 直接插入排序的时间复杂度可以提高到 O(n)。 可以设想, 若待排序记录序列基本有序时, 即序 列中具有特性 r[i].key<Max{ r[j].key},(1≤j<i) 的记录较少时, 直接插入排序的效率会大大提高。 希尔排 序正是从这一点出r[0];
/*将待插入记录插入到已排序的序列
}
第9章 内部排序
【算法9.1 直接插入排序】 该算法的要点是:① 使用监视哨r[0]临时保存待插入 的记录; ② 从后往前查找应插入的位置;③ 查找与移动在同一 循环中完成。 直接插入排序算法分析: 从空间角度来看,它只需要一个辅助空间r[0]。从时间 耗费角度来看, 主要时间耗费在关键字比较和移动元素上。 对于一趟插入排序,算法中的while循环的次数主要取决 于待插记录与前i-1个记录的关键字的关系上。
· 向量结构:将待排序的记录存放在一组地址连续的存 储单元中。 由于在这种存储方式中,记录之间的次序关系由其存 储位置来决定,所以排序过程中一定要移动记录才行。
第9章 内部排序
· 链表结构:采用链表结构时,记录之间逻辑上的相 邻性是靠指针来维持的,这样在排序时,就不用移动记录元素, 而只需要修改指针。 这种排序方式被称为链表排序。
第9章 内部排序 第9章 内部排序
9.1 9.2 插入类排序 9.3 交换类排序法 9.4 选择类排序法 9.5 9.6 分配类排序 9.7 各种排序方法的综合比较
第9章 内部排序 9.1 排序的基本概念
1. 排序
有n个记录的序列{R1,R2,…,Rn},其相应关键字的序列 是{K1,K2,…,Kn},相应的下标序列为1,2,…,n。通过排序, 要求找出当前下标序列1,2,…, n的一种排列p1,p2, …,pn, 使得相应关键字满足如下的非递减(或非递增)关系,即: Kp1≤Kp2≤…≤Kpn , 这 样 就 得 到 一 个 按 关 键 字 有 序 的 记 录 序 列 {Rp1,Rp2,…,Rpn}。
数据结构(c语言版)黄国瑜叶乃菁课件ch09
–若欲搜尋值大於Data[Middle]
•表示資料在Data[Middle]之後 •則我們必須搜尋Data[Middle]之後的資料 •資料範圍的左邊邊界(即上限)Low為Middle
+ 1。
9-5 插補搜尋
–若左邊邊界(即上限)Low小於資料範圍的 右邊邊界(即上限)High
•表示資料未搜尋完成,重新產生新的Middle值。 •Middle = Low + •否則,Middle = Low。
•Step 2
–欲尋找值57,與陣列中第二筆資料比對。 –57≠25,尋找下一筆。
9-2 線性搜尋
•Step 3
–欲尋找值57,與陣列中第三筆資料比對。 –57≠16,尋找下一筆。
•Step 4
–欲尋找值57,與陣列中第四筆資料比對。 –57≠23,尋找下一筆。
•Step 5
–欲尋找值57,與陣列中第五筆資料比對。 –57=57。找到該資料。
•Step 4
–59 > Data[9-1] = Data[8] = 58,表示資料在第九筆資料 之後。
–Root = Root + Distance_2 = 9 + 0 = 9 –Distance_1 = Distance_1 - Distance_2 = 1 – 0 = 1 –Distance_2 = Distance_2 - Distance_1 = 0 – 1 = -1 –但此時Distance_2為負,表示未能搜尋到資料。
9-3 二元搜尋
0
1
2
3
4
5
6
7
8
9 10
Data 5
7
12 25 34 37 43 46 58 80 92 1
《算法与数据结构——C语言描述》(第2版)电子教案 第9章 图
9.3 存储表示
9.3.1 邻接矩阵表示法
图的邻接矩阵表示包括:
• 一个顺序存储顶点信息的顶点表 • 一个存储顶点间相互关系的关系矩阵。
具体定义
• 设G=(V,E)为具有n个顶点的图,每个顶 点的类型为VexType,顶点表使用类型为 VexType的数组vexs表示;关系矩阵是一 个n*n的方阵,取名为arcs,具有以下性 质:
0 1 0 0 0
1
0
0
0
1
arcs
2
0
1
1 0
0 0
1 0
0
0
0 0 0 1 0
图的邻接矩阵表示法具有以下 特点∶
(1) 无向图的关系矩阵一定是一对称矩阵。 (2) 无向图的关系矩阵的第i行(或第i列)非零元素 个数为第i个顶点的度D(vi)。 (3) 有向图的关系矩阵的第i行非零元素个数为 第i个顶点的出度OD(vi),第i列非零元素个数就是 第i个顶点的入度ID(vi)。 (4) 从图的邻接矩阵表示,很容易确定图中任意 两个顶点之间是否有边相连。
• 当所有已被访问过的结点的相邻结点都被访问时, 如果图中还有未被访问的顶点,则从另一未被访问 过的顶点出发重复上述过程,直到图中所有顶点都 被访问过时,周游结束。
• 对图进行深度优先周游时,按访问顶点 的先后次序所得到的顶点序列,称为该 图的深度优先搜索序列,简称DFS序列
• 对于G1图,如果从v0出发得到的DFS序列 为∶v0,v1,v2;
typedef struct EdgeNode * EdgeList;
struct EdgeNode{
int endvex;
/* 相邻顶点在顶点表中下标 */
AdjType weight;
《C语言程序设计与数据结构》课件第09章
上述工人( 上述工人(worker)结构体类型可以声明为: )结构体类型可以声明为: struct worker { char name[20]; char sex; int age, number; float salary; }; ;
C语言程序设计与数据结构
9.2 结构体变量
C语言程序设计与数据结构
工人包含有多个属性,比如姓名、性别、年龄、 工人包含有多个属性,比如姓名、性别、年龄、 包含有多个属性 工号、工资等等, 工号、工资等等,我们无法简单的用某一种数据类 型或者数组来实现 。
C语言程序设计与数据结构
解决方法: 解决方法: C语言中引入了一种新的数据结构,称为“结构体”。 语言中引入了一种新的数据结构,称为“结构体” 它可以把若干个有内在联系的数据组合在一起, 它可以把若干个有内在联系的数据组合在一起,形成 一个有机整体。 一个有机整体。
第九章 结构体与共用体
C语言程序设计与数据结构
总体要求: 总体要求: 掌握结构体的概念; 掌握结构体的概念; 掌握结构体成员的引用; 掌握结构体成员的引用; 学会使用typedef声明数据类型的别名。 声明数据类型的别名。 学会使用 声明数据类型的别名C语言程序设计与数据结构
学习重点: 学习重点: 结构体的概念; 结构体的概念; 结构体成员的引用。 结构体成员的引用。
C语言程序设计与数据结构
说明: 说明: (1) 句首 句首struct是关键字, 是声明结构体类型的标识符。 “ 结 是关键字, 是关键字 是声明结构体类型的标识符。 构体标识名” 定义的是结构体的名字, 它是可选项, 构体标识名 ” 定义的是结构体的名字 , 它是可选项 , 可以 不出现; “ 结构体成员名表”由多个成员名组成, 彼此之 不出现 ; 结构体成员名表 ” 由多个成员名组成, 间用分号隔开,两者都要符合标识符的命名规则。 间用分号隔开,两者都要符合标识符的命名规则。 (2) 结构体中定义的所有成员都用大括号括起来,成员名可以 结构体中定义的所有成员都用大括号括起来, 与程序中其他变量相同。 与程序中其他变量相同。 (3) 结构体中的“数据类型名”可以是基本类型,也可以是构 结构体中的“数据类型名”可以是基本类型, 造类型( 如数组) , 还可以是已经定义的其他结构体类型。 造类型 ( 如数组 ) 还可以是已经定义的其他结构体类型。 (4) 结构体类型的定义只是创建了一种模式,表示该结构体 结构体类型的定义只是创建了一种模式, 的组成情况。结构体定义结束后, 的组成情况。结构体定义结束后,系统并没有为该结构体 分配相应的空间; 分配相应的空间;只有在我们使用这种结构体进行定义变 量后,系统才为结构体变量分配存储空间。 量后,系统才为结构体变量分配存储空间。
数据结构-第9章
下面讨论顺序查找的实现。
假定有n个记录r0, r1, …, rn-1 顺序地存放在记录数组r中, 其中第i个记录的关键字值为ri ·key 。 如果给定一个关键数据k, 则用k依次与r0 ·key, r1·key, …进行相等比较, 一旦找到某一个记 录的关键字值与k相等, 即ri ·key =k, 则查找成功, 回送下标i。
第9章 查找
如果允许增设一个虚拟记录rn(只要不引起数组r的下标 溢出即可)作为循环控制的边界, 上面算法中的循环控制条件可 以减少一个, 而得到如下较快的顺序查找算法: 算法 9.2 Void Sequrt-Search2 (struct node r[], int n, int k)
5123143477391104
第9章 查找
若用整型变量low、 m、 high分别表示被查区间的第一个、 中间一个和最后一个记录的下标, 则开始查找时有low=0, high =7, m=[(0+7)/2]=3, 第一个、 中间一个和最后一个记录 的关键字值分别为 r0·key、 r3·key 和r7·key。 假设要 查找k=73的记录, 则折半查找过程如下:
{ int i=0;
r[n]·key=k; while (r[i]·key!=k) i=i+1; if(i<n) printf("%3d, it is r[%2d]", k, i); else prnitf("%3d not found", k);
}
第9章 查找
算法分析: (1) 在最坏的情况下, 顺序查找需要比较n次, 即MSL=n。
(2) 假定各记录的查找机会均等, 即Pi=1/n, 由于查找第i个记 录需要比较i次, 即ci =i, 于是有