算法
文章平均质量分 75
RB_VER
这个作者很懒,什么都没留下…
展开
-
冒泡、选择、插入、希尔、快速、归并、堆排序算法的实现
冒泡排序选择排序import java.util.Scanner;public class Selection4 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int len = scanner.nextInt(); int[] arr = new int[len]; for (int i = 0;i &原创 2021-07-04 09:49:52 · 113 阅读 · 0 评论 -
【alg4-字符串】霍夫曼压缩
数据压缩压缩数据的原因主要有两点:节省保存信息所需的空间和节省传输信息所需的时间。基础模型数据压缩的基础模型由两个主要的部分组成,两者都是一个能够读写比特流的黑盒子:压缩盒:能够将一个比特流B转化为压缩后的版本C(B);展开盒:能够将C(B)转化为回B。如果使用|B|表示比特流中的比特的数量的话,我们感兴趣的是将|C(B)|/|B|最小化,这个值被称为压缩率。这种模型叫无损压缩模型——保证不丢失任何信息,即压缩和展开之后的比特流必须和原始的比特流完全相同。许多种类型的文件都会用到无损压缩,原创 2020-12-28 19:30:05 · 142 阅读 · 0 评论 -
【alg4-字符串】正则表达式的模式匹配
非确定有限状态自动机我们将KMP算法看作一台由模式字符串构造的能够扫描文本的有限状态自动机。对于正则表达式,我们要将这个思想推而广之。KMP的有限状态自动机会根据文本中的字符改变自身的状态。当且仅当自动机达到停止状态时它才找到了一个匹配。算法本身就是模拟这种自动机,这种自动机的运行很容易模拟的原因是因为它是确定性的:每种状态的转换都完全由文本中的字符所决定。要处理正则表达式,就需要一种更加强大的抽象自动机。因为或操作的存在,自动机无法仅根据一个字符就判断出模式是否出现;事实上,因为闭包的存在,自动机甚原创 2020-12-26 10:41:08 · 264 阅读 · 1 评论 -
【alg4-字符串】正则表达式
正则表达式在许多应用程序中,我们查找子字符串时并没有被查找模式的完整信息。文本编辑器的用户可能希望仅指定模式的一部分,或是指定某种能够匹配若干个不同单词的模式,或是指定几种可以任意匹配的不同模式。正则表达式用自然、简单而强大的3种操作组合来描述模式。使用正则表达式描述模式模式的描述由3种基本操作和作为操作数的字符组成。这里,我们用语言指代一个字符串的集合(可能是无限的),用模式指代一种语言的详细说明。连接操作当我们写出AB时,就指定了一种语言{AB}。它含有一个由两个字符组成的字符串,由A和B连原创 2020-12-25 10:56:35 · 256 阅读 · 0 评论 -
【alg4-子字符串查找】Boyer-Moore算法
Boyer-Moore字符串查找算法在用于查找子字符串的算法当中,BM(Boyer-Moore)算法被认为最高效的字符串搜索算法,它由Bob Boyer和J Strother Moore设计于1977年。 一般情况下,比KMP算法快3-5倍。该算法常用于文本编辑器中的搜索匹配功能,比如大家所熟知的GNU grep命令使用的就是该算法,这也是GNU grep比BSD grep快的一个重要原因。启发式的处理不匹配的字符如图显示了在文本FINDINAHAYSTACKNEEDLEINA中查找模式NEEDLE的原创 2020-12-24 16:47:21 · 226 阅读 · 0 评论 -
【alg4-子字符串查找】KMP算法
Knuth-Morris-Pratt子字符串查找算法KMP算法的基本思想是当出现不匹配时,就能知晓一部分文本内容(因为在匹配失败之前它们已经和模式相匹配)。我们可以利用这些信息避免将指针回退到所有这些已知的字符之前。KMP算法的主要思想是提前判断如何重新开始查找,而这种判断只取决于模式本身。模式指针的回退在KMP子字符串查找算法中,不会回退文本指针i,而是使用一个数组dfa[][]来记录匹配失败时模式指针j应该回退多远。对于每个字符c,在比较了c和pat.chatAt(j)之后,dfa[c][j]表原创 2020-12-24 11:02:32 · 119 阅读 · 0 评论 -
【alg4-子字符串查找】暴力子字符串查找算法
子字符串查找给定一段长度为N的文本和一个长度为M的模式字符串,在文本中找到一个和该模式相符的子字符串。暴力子字符串查找算法子字符串有一个简单而使用广泛的暴力算法。虽然它在最坏情况下的运行时间与MN成正比,但是在处理许多应用程序中的字符串时,它的实际运行时间一般与M+N成正比。另外,它很好地利用了大多数计算机系统中标准的结构特性,因此即使是更加巧妙的算法也很难超越它经过优化后的版本的性能。方法一使用一个指针i跟踪文本,一个指针j跟踪模式。对于每个i,代码首先将j重置为0并不断将它增大,直至找到了一个原创 2020-12-23 09:24:49 · 210 阅读 · 0 评论 -
【alg4-字符串】三向单词查找树
三向单词查找树为了避免R向单词查找树过度的空间消耗,可以使用三向单词查找树(TST)。在三向单词查找树中,每个结点都含有一个字符、三条链接和一个值。这三条链接分别对应着当前字母小于、等于和大于结点字母的所有键。在R向单词查找树中,树的结点含有R条链接,每个非空链接的索引隐式地表示了它所对应的字符。在等价的三向单词查找树中,字符是显式地保存在结点中的——只有在沿着中间链接前进时才会根据字符找到表中的键。查找与插入操作在查找时,首先比较键的首字母和根结点的字母。如果键的首字母较小,就选择左链接;如果较大,原创 2020-12-22 19:37:36 · 220 阅读 · 0 评论 -
【alg4-字符串】单词查找树
单词查找树基本性质和各种查找树一样,单词查找树也是由链接的结点所组成的数据结构,这些链接可能为空,也可能指向其他结点。每个结点都只可能有一个指向它的结点,称为它的父结点(只有一个结点除外,即根结点,没有任何结点指向根结点)。每个结点都含有R条链接,其中R为字母表的大小。单词查找树一般都含有大量空链接,因此在绘制一棵单词查找树时一般会忽略空链接。尽管链接指向的是结点,但是也可以看作链接指向的是另一棵单词查找树,它的根结点就是被指向的结点。每条链接都对应着一个字符——因为每条链接都只能指向一个结点。每个结点原创 2020-12-22 16:30:09 · 150 阅读 · 0 评论 -
【alg4-字符串】低位优先的字符串排序
字符串排序对于许多排序应用,决定顺序的键都是字符串。第一类方法会从右到左检查键中的字符。这种方法一般被称为低位优先(Least=Significant-Digit First,LSD)的字符串排序。使用数字(digit)代替字符(character)的原因要追溯到相同方法在各种数字类型中的应用。如果将一个字符串看作一个256进制的数字,那么从右向左检查字符串就等价于先检查数字的最低位。这种方法最适合用于键的长度都相同的字符串排序应用。第二类方法会从左到右检查键中的字符,首先查看的是最高位的字符。这些方原创 2020-12-22 14:52:49 · 215 阅读 · 0 评论 -
【alg4-最短路径】Dijkstra算法
单点最短路径给定一幅加权有向图和一个起点s,回答“从s到给定的目的顶点v是否存在一条有向路径?如果有,找出最短(总权重最小)的那条路径。”等类似问题。最短路径树给定一幅加权有向图和一个顶点s,以s为起点的一棵最短路径树是图的一幅子图,它包含s和从s可达的所有顶点。这颗有向树的根结点为s,树的每条路径都是有向图中的一条最短路径。最短路径算法的理论基础最优性条件令G为一幅加权有向图,顶点s是G中的起点,distTo[]是一个由顶点索引的数组,保存的是G中路径的长度。对于从s可达的所有顶点v,dist原创 2020-12-19 20:30:14 · 201 阅读 · 1 评论 -
【alg4-排序】索引优先队列
在很多应用中,允许用例引用已经进入优先队列中的元素是有必要的。做到这一点的一种简单方法是给每个元素一个索引。索引优先队列的APIAPI功能IndexMinPQ(int maxN)创建一个最大容量为maxN的优先队列,索引的取值范围为0至maxN-1void insert(int i, Key key)插入一个元素,将它和索引i相关联void change(int i, Key key)将索引为i的元素设为keyboolean contains(int i)是原创 2020-12-19 16:46:59 · 95 阅读 · 1 评论 -
【alg4-最短路径】加权有向图
加权有向边的APIAPI功能double weight()边的权重int from()指出这条边的顶点int to()这条边指向的顶点String toString()对象的字符串表示加权有向图的APIAPI功能EdgeWeightedDigraph(int V)含有V个顶点的空有向图EdgeWeightedDigraph(int vn, int en, int[][] data, double[] weights)读取图原创 2020-12-19 09:30:01 · 169 阅读 · 1 评论 -
【alg4-最小生成树】Kruskal算法
算法思想Kruskal算法的主要思想是按照边的权重顺序(从小到大)处理它们,将边加入最小生成树中,加入的边不会与已经加入的边构成环,直到树中含有V-1条边为止。边逐渐由一片森林合并为一棵树。Kruskal算法能够计算任意加权连通图的最小生成树。Prim算法是一条边一条边地来构造最小生成树,每一步都为一棵树添加一条。Kruskal算法构造最小生成树的时候也是一条边一条边地构造,但不同的是它寻找的边会连接一片森林中的两棵树。我们从一片由V棵单顶点的树构成的森林开始并不断将两棵树合并(用可以找到的最短边)直原创 2020-12-18 15:36:18 · 148 阅读 · 0 评论 -
【alg4-最小生成树】Prim算法(延时实现)
最小生成树定义:图的生成树是它的一棵含有其所有顶点的无环连通子图。一幅加权图的最小生成树(MST)是它的一棵权值(树中所有边的权值之和)最小的生成树。证明最小生成树的基本性质:用一条边连接树中的任意两个顶点都会产生一个新的环;从树中删去一条边将会得到两棵独立的树。切分定理定义:图的一种切分是将图的所有顶点分为两个非空且不重叠的两个集合。横切边是一条连接两个属于不同集合的顶点的边。通常,我们通过指定一个顶点集并隐式地认为它的补集为另一个顶点集来指定一个切分。这样,一条横切边就是连接该集合的一原创 2020-12-18 14:22:07 · 188 阅读 · 0 评论 -
【alg4-最小生成树】加权无向图
API加权边的API:API功能Edge(int v, int w, double weight)用于初始化的构造函数double weight()边的权重int either()边两端的顶点之一int other(int v)另一个顶点int compareTo(Edge that)将这条边与that比较String toString()对象的字符串表示加权无向图的API:API功能EdgeWeightedGra原创 2020-12-18 09:25:33 · 139 阅读 · 0 评论 -
【alg4-有向图】Kosaraju算法(计算强连通分量)
有向图中的强连通性定义:如果两个顶点v和w是互相可达的,则称它们为强连通的。也就是说,既存在一条从v到w的有向路径,也存在一条从w到v的有向路径。如果从一幅有向图中的任意两个顶点都是强连通的,则称这幅有向图也是强连通的。两个顶点是强连通的当且仅当它们都在一个普通的有向环中。强连通分量和无向图中的连通性一样,有向图中的强连通性也是一种顶点之间的等价关系,因为它有着以下性质:自反性:任意顶点v和自己都是强连通的。对称性:如果v和w是强连通的,那么w和v也是强连通的。传递性:如果v和w是强连通的且原创 2020-12-17 16:46:22 · 231 阅读 · 0 评论 -
【alg4-有向图】有向环检测和拓扑排序
优先级限制下的调度问题给定一组需要完成的任务,以及一组关于任务完成的先后次序的优先级限制。在满足限制条件的前提下应该如何安排并完成所有任务?对于任意一个这样的问题,我们都可以马上画出一张有向图,其中顶点对应任务,有向边对应优先级顺序。在有向图中,优先级限制下的调度问题等价于下面这个基本的问题。拓扑排序。给定一幅有向图,将所有的顶点排序,使得所有的有向边均从排在前面的元素指向排在后面的元素。有向图中的环一般来说,如果一个有优先级限制的问题中存在有向环,那么这个问题肯定是无解的。要检查这种错误,需要原创 2020-12-17 15:23:51 · 736 阅读 · 0 评论 -
【alg4-有向图】单点可达性和多点可达性
有向图的可达性单点可达性:给定一幅有向图和一个起点s,回答“是否存在一条从s到达给定顶点v的有向路径?”等类似问题。多点可达性:给定一幅有向图和顶点集合,回答“是否存在一条从集合中的任意顶点到达给定顶点v的有向路径?”等类似问题。我们可以使用深度优先搜索来解决这类问题。有向图可达性APIAPI功能DirectedDFS(Digraph G, int s)在G中找到从s可达的所有顶点DirectedDFS(Digraph G, Iterable<Integer>原创 2020-12-17 09:16:12 · 631 阅读 · 0 评论 -
【alg4-图】有向图
有向图在有向图中,边是单向的:每条边所连接的两个顶点都是一个有序对,它们的邻接性是单向的。术语定义:一幅有方向性的图是由一组顶点和一组有方向的边组成的,每条有方向的边都连接着有序的一对顶点。出度:一个顶点的出度为由该顶点指出的边的总数。入度:一个顶点的入度为指向该顶点的边的总数。头:一条有向边的第一个顶点称为它的头。尾:第二个顶点称为它的尾。除了特殊的图,一幅有向图中的两个顶点的关系可能有4种:没有边相连;存在从v到w的边v->w;存在从w到v的边w->v;即存在v-&原创 2020-12-17 08:55:30 · 1067 阅读 · 1 评论 -
【alg4-无向图】符号图
符号图在典型应用中,图都是通过文件或者网页定义的,使用的是字符串而非整数来表示和指代顶点。为了适应这样的应用,我们定义了拥有以下性质的输入格式:用指定的分隔符来隔开顶点名;每一行都表示一组边的集合,每一条边都连接着这一行的第一个名称表示的顶点和其他名称所表示的顶点;顶点总数V和边的总数E都是隐式定义的。如图所示表示的是一个小型运输系统的模型,其中表示每个顶点的是美国机场的代码,连接它们的边则表示顶点之间的航线。API用符号作为顶点名的图的API:API功能Symbo原创 2020-12-08 19:36:27 · 347 阅读 · 0 评论 -
【alg4-无向图】使用深度优先搜索解决双色问题
使用深度优先搜索来判断一幅图是否能够用两种颜色将图的所有顶点着色,使得任意一条边的两个端点的颜色都不相同,这个问题等价于:这是一幅二分图吗?package section4_1;public class TwoColor { private boolean[] marked; private boolean[] color; private boolean isTwoColorable = true; public TwoColor(Graph G) {原创 2020-12-08 15:15:07 · 262 阅读 · 0 评论 -
【alg4-无环图】使用深度优先搜索检测环
package section4_1;public class Cycle { private boolean[] marked; private boolean hasCycle; public Cycle(Graph G) { marked = new boolean[G.V()]; for (int s = 0;s < G.V();s++) { if (!marked[s]) {原创 2020-12-08 14:50:33 · 140 阅读 · 0 评论 -
【alg4-无向图】使用DFS找出所有连通分量
深度优先搜索的下一个直接应用就是找出一幅图的所有连通分量。“与…连通”是一种等价关系,它能够将所有顶点切分为等价类(连通分量)。连通分量的API:API功能CC(Graph G)预处理构造函数boolean connected(int v, int w)v和w连通吗int count()连通分量数int id(int v)v所在的连通分量的标识符(0~count()-1)CC的实现使用了marked[]数组来寻找一个顶点作为每个连通分量中深度优先搜索的原创 2020-12-08 14:17:44 · 624 阅读 · 0 评论 -
【alg4-无向图】广度优先搜索
深度优先搜索得到的路径不仅取决于图的结构,还取决于图的表示和递归调用的性质。我们很自然地还经常对下面这些问题感兴趣。单点最短路径:给定一幅图和一个起点s,回答“从s到给定目的顶点v是否存在一条路径?如果有,找出其中最短的那条(含边数最少)”等类似问题。解决这个问题的经典方法叫做广度优先搜索。深度优先搜索在这个问题上没有什么作为,因为它遍历整个图的顺序和找出最短路径的目标没有任何关系。在深度优先搜索中,我们用了一个可以下压的栈(这是由系统管理的,以支持递归搜索方法)。在广度优先搜索中,我们希望按照与起点原创 2020-12-08 09:32:23 · 493 阅读 · 0 评论 -
【alg4-无向图】寻找路径
深度优先搜索可以解决单点路径问题,即给定一幅图和一个起点s,回答“从s到给定目的顶点v是否存在一条路径?如果有,找出这条路径。”等类似问题。API功能Paths(Graph G, int s)在G中找出所有起点为s的路径boolean hasPathTo(int v)是否存在从s到v的路径Iterable<Integer> pathTo(int v)s到v的路径,如果不存在则返回null以下算法实现中edgeTo[]记住每个顶点到起点的路径。使用深原创 2020-12-08 08:26:16 · 476 阅读 · 0 评论 -
【alg4-无向图】深度优先搜索
要搜索一幅图,只需用一个递归方法来遍历所有顶点。在访问其中一个顶点时:将它标记为已访问;递归地访问它的所有没有被标记过的邻居顶点。这种方法称为深度优先搜索。深度优先搜索标记与起点连通的所有顶点所需的时间和顶点的度数之和成正比。这里Graph用的是采用邻接表的无向图。package section4_1;public class DepthFirstSearch { private boolean[] marked; private int count; pub原创 2020-12-07 20:05:09 · 153 阅读 · 0 评论 -
【alg4-图】无向图
无向图图定义:图是一组顶点和一组能够将两个顶点相连的边组成的。若边仅仅是两个顶点之间的连接,为了和其他图模型相区别,我们称为无向图。术语表相邻:当两个顶点通过一条边相连时,我们称这两个顶点是相邻的,并称这条边依附于这两个顶点。度数:某个顶点的度数即为依附于它的边的总数。子图:是由一幅图的所有边的一个子集(以及它们所依附的所有顶点)组成的图。许多计算问题都需要识别各种类型的子图,特别是由能够顺序连接一系列顶点的边所组成的子图。路径:是由边顺序连接的一系列顶点。简单路径:是一条没有重复顶点的路径原创 2020-12-07 19:00:43 · 783 阅读 · 0 评论 -
【alg4-查找】散列表
如果所有的键都是小整数,我们可以用一个数组来实现无序的符号表,将键作为数组的索引而数组中键i处存储的就是它对应的值。这样我们就可以快速访问任意的键。我们需要用算术操作将复杂类型的键转化为数组的索引来访问数组中的键值对。使用散列的查找算法分为两步:第一步是用散列函数将被查找的键转化为数组的一个索引。理想情况下,不同的键都能转化为不同的索引值。第二步就是一个处理碰撞冲突的过程,例如拉链法和线性探测法。散列表是算法在时间和空间上作出权衡的经典例子。如果没有内存限制,我们可以直接将键作为(可能是一个超大的)原创 2020-12-07 09:00:56 · 249 阅读 · 0 评论 -
【alg4-查找】平衡查找树
在一棵含有N个结点的树中,我们希望树高为~lgN,这样我们就能保证所有查找都能在~lgN次比较内结束。2-3查找树一棵2-3查找树或为一棵空树,或由以下结点组成:2-结点,含有一个键(及其对应的值)和两条链接,左链接指向的2-3树中的键都小于该结点,右链接指向的2-3树中的键都大于该结点。3-结点,含有两个键(及其对应的值)和三条链接,左链接指向的2-3树中的键都小于该结点,中链接指向的2-3树中的键都位于该结点的两个键之间,右链接指向的2-3树中的键都大于该结点。和以前一样,我们将指向一棵空原创 2020-12-05 10:26:28 · 226 阅读 · 0 评论 -
【alg4-查找】二叉查找树
定义:一棵二叉查找树(BST),其中每个结点都含有一个Comparable的键(以及相关联的值)且每个结点的键都大于其左子树中的任意结点的键而小于右子树的任意结点的键。二叉查找树是一种能够将链表插入的灵活性和有序数组查找的高效性结合起来的符号表实现。基本实现数据表示和链表一样,我们嵌套定义了一个私有类来表示二叉查找树上的一个结点。每个结点都含有一个键、一个值、一条左链接、一条右链接和一个结点计数器。查找在二叉查找树中查找一个键的递归算法:如果树是空的,则查找未命中;如果被查找的键和根结点的键相等原创 2020-12-04 09:42:47 · 204 阅读 · 0 评论 -
【alg4-查找】符号表
符号表定义:符号表是一种存储键值对的数据结构,支持两种操作:插入(put),即将一组新的键值对存入表中;查找(get),即根据给定的键得到相应的值。符号表最主要的目的就是将一个键和一个值联系起来。符号表是一种典型的抽象数据类型。符号表具体实现无序链表中的顺序查找APIpublic class ST<Key, Value>API功能ST()创建一张符号表void put(Key key, Value val)将键值对存入表中(若值为空则将键key从表中原创 2020-12-03 10:29:52 · 311 阅读 · 0 评论 -
【alg4-排序】堆排序
堆排序可以分为两个阶段。在堆的构造阶段中,我们将原始数组重新组织安排进一个堆中;然后在下沉排序阶段,我们从堆中按递减顺序取出所有元素并得到排序结果。堆的构造:从右至左用sink()函数构造子堆。数组的每个位置都已经是一个子堆的根结点了,sink()对于这些子堆也适用。如果一个结点的两个子结点都已经是堆了,那么在该结点上调用sink()可以将它们变成一个堆。这个过程会递归地建立起堆的秩序。开始时我们只需要扫描数组中的一半元素,因为我们可以跳过大小为1的子堆。最后我们在位置1上调用sink()方法,扫描结束。原创 2020-11-30 21:42:35 · 202 阅读 · 0 评论 -
【alg4-排序】优先队列
许多应用程序都需要处理有序的元素,但不一定要求它们全部有序,或是不一定要一次就将它们排序。很多情况下我们会收集一些元素,处理当前键值最大的元素,然后再收集更多的元素,再处理当前键值最大的元素,如此这般。在这种情况下,一个合适的数据结构应该支持两种操作:删除最大元素和插入元素。这种数据类型叫做优先队列。优先队列的一些重要的应用场景包括模拟系统,其中事件的键即为发生的时间,而系统需要按照时间顺序处理所有事件;任务调度,其中键值对应的优先级决定了应该首先执行哪些任务;数值计算,键值代表计算错误,而我们需要按照原创 2020-11-30 20:28:00 · 251 阅读 · 0 评论 -
【alg4-排序】快速排序
快速排序流行的原因是它实现简单、适用于各种不同的输入数据且一般应用中比其他排序算法都要快很多。快速排序引人注目的特点包括它是原地排序(只需要一个很小的辅助栈),且将长度为N的数组排序所需的时间和NlgN成正比。它的主要缺点是非常脆弱,在实现时要非常小心才能避免低劣的性能。快速排序是一种分治的算法。它将一个数组分成两个子数组,将两部分独立地排序。在快速排序中,切分(partition)的位置取决于数组的内容。一般策略是先随意地选取a[lo]作为切分元素,即那个将会被排定的元素,然后我们从数组的左端开始向右原创 2020-11-29 10:46:25 · 156 阅读 · 0 评论 -
【alg4-排序】归并排序
归并操作:即将两个有序的数组归并成一个更大的有序数组。归并排序示意图:归并排序最吸引人的性质是它能够保证将任意长度为N的数组排序所需时间和NlogN成正比;它的最主要缺点则是它所需的额外空间和N成正比。原地归并的抽象方法它将涉及的所有元素复制到一个辅助数组中,再把归并的结果放回原数组中。merge方法在归并时进行了4个条件判断:左半边用尽(取右半边的元素)右半边用尽(取左半边的元素)右半边的当前元素小于左半边的当前元素(取右半边的元素)右半边的当前元素大于等于左半边的当前元素(取左半边原创 2020-11-28 10:16:25 · 131 阅读 · 0 评论 -
【alg4-排序】希尔排序
对于大规模乱序数组插入排序很慢,因为它只会交换相邻的元素,因此元素只能一点点地从数组的一端移动到另一端。希尔排序为了加快速度简单地改进了插入排序,交换不相邻的元素以对数组的局部进行排序,并最终用插入排序将局部有序的数组排序。希尔排序的思想是使数组中任意间隔为h的元素都是有序的。在进行排序时,如果h很大,我们就能将元素移动到很远的地方,为实现更小的h有序创造方便。用这种方式,对于任意以1结尾的h序列,我们都能够将数组排序。下面算法的实现使用了序列1/2(3^k-1),从N/3开始递减至1。我们把这个序列称原创 2020-11-27 15:13:01 · 108 阅读 · 0 评论 -
【alg4-排序】插入排序
在计算机的实现中,为了给要插入的元素腾出空间,我们需要将其余所有元素在插入之前都向右移动一位。这种算法叫做插入排序。排序过程如图:与选择排序一样,当前索引左边的所有元素都是有序的,但它们的最终到达位置还不确定,为了给更小的元素腾出空间,它们可能会被移动。但是当索引到达数组的右端时,数组排序就完成了。和选择排序不同的是,插入排序所需的时间取决于输入中元素的初始顺序。例如,对于一个很大且其中的元素已经有序(或接近有序)的数组进行排序将会比对随机顺序的数组或是逆序数组进行排序要快得多。package s原创 2020-11-27 10:16:29 · 112 阅读 · 0 评论 -
【alg4-排序】选择排序
Comparable接口实现了Comparable接口的数据类型就能够保证用例代码可以将其排序,只需要实现一个compareTo()方法来定义目标类型对象的自然次序。compareTo()必须实现一个全序关系,即:自反性,对于所有的v,v=v;反对称性,对于所有的v<w都有v>w,且v=w时w=v;传递性,对于所有的v、w和x,如果v<=w且w<=x,则v<=x。总之,compareTo()实现了我们的主键抽象——它给出了实现了Comparable接口的任意数据原创 2020-11-27 09:31:38 · 148 阅读 · 0 评论 -
【alg4】union-find算法
问题描述动态连通性问题的输入是一列整数对,其中每个整数都表示一个某种类型的对象,一对整数p和q可以被理解为”p和q是相连的“。假设”相连“是一种等价关系,意味着具有:自反性:p和p是相连的;对称性:如果p和q是相连的,那么q和p也是相连的;传递性:如果p和q是相连的且q和r是相连的,那么p和r也是相连的。等价关系能够将对象分为多个等价类。在这里,当且仅当两个对象相连时它们才属于同一等价类。我们的目标是编写一个程序来过滤掉序列中所有无意义的整数对。换句话说,当程序从输入中读取了整数对p q时,原创 2020-11-27 08:16:55 · 199 阅读 · 0 评论