随笔分类 - 数据结构与算法
摘要:排序算法之基数排序 基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度
阅读全文
摘要:排序算法之合并排序 一、递归的合并排序 思想:合并排序(merge sort)又称归并排序,要点是反复将两个长度较短的有序段,合并成一个有序段,直到数组中只含一个有序段。 递归的合并排序算法: void merge_sort(s) { if(s的长度不大于1) return; 把s分成长度相等的两段
阅读全文
摘要:排序算法之堆排序 堆的定义:堆是每个非叶结点值都大于或等于其儿子值(父大于子)的完全二叉树。 用数组a[n+1]存储长度为n的堆(a[0]不用) a[i]≥a[2*i] a[i]≥a[2*i+1] 根结点a[1]存储的是最大值(大根堆) 可以自定义小根堆 示例 排序阶段的操作方法: 步骤1)令j=n
阅读全文
摘要:排序算法之选择排序 原理:从n个元素中选出一个最大元素,调到序列末端再从剩下的n-1个元素中选出最大元素……,反复如此,可完成排序。 简单选择算法: for(k=n-1;k>0;k - -) { i=0; for(j=1;j<=k;j++) if(a[j]>a[i]) i=j; //选最大元 交换a
阅读全文
摘要:排序算法之快速排序 基本原理——反复进行有序划分。 有序划分方法 在数组a中任选一个元素x作为划分元素,通过比较将小于x的元素换到数组的左端(左段), 将大于或等于x的元素换到数组右端(右段),x本身位于两段之间。如果左、右段元素个数多于1,则递归的将左、右段各自划分,直到每段元素个数都不超过1,从
阅读全文
摘要:排序算法之冒泡排序 原理:反复扫描数组a,比较相邻元素a[i]与a[i+1]。 若逆序(a[i]>a[i+1])就交换 自上而下地扫描的下降法 最大元素下降到底部 自下而上地扫描的上升法 最小元素上升到数组顶部 上升法图例: 简单的冒泡排序算法(上升法) void bubble_sort(int a
阅读全文
摘要:排序算法之希尔排序 基本原理: Donald.L.Shell设计的排序算法。 特点: (1)缩小增量 (2)多遍插入排序 例如,选用增量序列(9,5,3,1) 4个增量,进行4遍插入排序 。 术语: h-排序(h-sorted) h-子序列(h-subsequence) h-有序的(h-ordere
阅读全文
摘要:排序算法 排序的含义:排序(sorting),又称分类。是将无序序列变换成有序序列的一种运算。如果参加排序的数据结点含多个域,那么,排序往往是针对其中某个域而言的。 排序方法的分类: 按数据存储介质:内部排序和外部排序 按比较器个数:串行排序和并行排序 按主要操作:比较排序和基数排序 按辅助空间多少
阅读全文
摘要:图结构的类实现示例 说明:以无向图为例,给出图类、先深搜索和拓扑排序的类实现 1.邻接表存储的图类 (1)有关类型定义 typedef char Vname_type; //顶点名类型,假定字符型 typedef int Vdata_type; //顶点所带信息类型,假定整型 typedef flo
阅读全文
摘要:拓扑排序 概念:将有向图G的顶点排成一个序列,使得,如果v到w有路,则v排在w之前(注意,并非v排在w之前,v到w就一定有路),拓扑排序所得的顶点序列是图的拓扑序列。 算法描述 步骤1)当图中存在入度为0顶点时,循环: ①任选一个入度为0的顶点v,输出v ②删去v,以及v射出的边 步骤2)循环终止时
阅读全文
摘要:Floyd算法 思想:将n个顶点的图G“分成”很多子图 每对顶点vi和vj对应子图Gij(i=0,1,…,n-1和j=0,1,…,n-1) 每对顶点vi和vj都保留一条顶点限于子图Gij中的最短路径Pij(称为待定路径),其长度为Dij,不断地往子图Gij中增加“中间过渡点”(子图不断扩大),不断地
阅读全文
摘要:图的最优化问题:最小生成树、最短路径 典型的图应用问题 无向连通加权图的最小生成树 有向/无向加权图的最短路径 四个经典算法 Kruskal算法、Prim算法 最小生成树 Dijkstra算法、Floyd算法 最短路径 单源最短路径问题(单源路径问题) 求某指定顶点(称为源点)到其余各顶点的最短路径
阅读全文
摘要:最小生成树的Prim算法 思想:采用子树延伸法 将顶点分成两类: 生长点——已经在生成树上的顶点 非生长点——未长到生成树上的顶点 使用待选边表: 每个非生长点在待选边表中有一条待选边,一端连着非生长点,另一端连着生长点 步骤: 步骤1)构造初始待选边表,任选一个顶点v作为初始生长点,对其余每个非生
阅读全文
摘要:图的最优化问题:最小生成树、最短路径 典型的图应用问题 无向连通加权图的最小生成树 有向/无向加权图的最短路径 四个经典算法 Kruskal算法、Prim算法 最小生成树 Dijkstra算法、Floyd算法 最短路径 最小生成树的概念: G=(V,E):无向连通加权图 C(e)或C(v,w): 边
阅读全文
摘要:/*图遍历的源代码 通过邻接矩阵的方式来保存给结点的值,再通过边的连接形成一个图。 验证深度优先搜索、广度优先搜索。 */
阅读全文
摘要:图的遍历 图的遍历:搜索属于图的基本运算。树的先序遍历和按层遍历的推广。图的遍历也称搜索,主要有: 先深搜索(depth-first search)——深度优先搜索——dfs搜索 先广搜索(breadth-first search)——广度优先搜索——bfs搜索 遍历目的——完成图运算(求子图或路径
阅读全文
摘要:图结构的基本概念 图的定义:用于描述多对多的网状关系。 由用于表示事物的顶点(vertex)集合V,以及表示事物之间关系的边(edge)集合E构成 记作G=(V,E) 顶点数目n>0,边数目m≥0 V:非空有穷顶点(vertex)集 E :V上的顶点对所构成的边(edge)集 边的概念: 1.边 有
阅读全文
摘要:2.检索树类 下面定义的检索树类bin_search_tree 继承二叉树类binary_tree的成员数据(根指针root)和成员函数,并追加检索树特需的成员函数:插入、删除、构造、查找,结点类同binary_node类
阅读全文
摘要:哈夫曼树 定义:给定n个正实数w1至wn,使权WPL(T)达最小值的树,称为哈夫曼树(最优二叉树)。(其中n表示该树中叶结点的数目,wk和lk(k=1,2,···,n)分别表示叶结点ik的权值和从树根到叶结点ik之间的路径长度。) 注意:哈夫曼树必是正则二叉树! 下面还要明白几个重要的概念: 1.
阅读全文
摘要:B树、B++树和Trie树 B树 定义:一个非空M元(也称M阶)B树(R.Bayer,1970年) 满足下列条件: 1)每个结点含有m个元素a1<a2<…<am。含有m个元素的结点有m+1个子树,m称为结点长度 2)结点长度m满足: 根结点,1≤m≤M-1 可以有2~M个子树 非根结点,M/2-
阅读全文