数据结构和算法
文章平均质量分 65
CmdSmith
这个作者很懒,什么都没留下…
展开
-
约瑟夫算法 Java实现
约瑟夫环:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。public class YuesefuTest { public static void main(String[] args) { int totalNum = 10;原创 2017-01-04 14:37:59 · 821 阅读 · 0 评论 -
快速排序(Quick Sort) Java实现
快速排序(Quick Sort)快速排序(Quick Sort)的基本思想是:通过一趟排序将待排记录分割成独立的两部分其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。快速排序优化1.优化选取枢轴 三数取中(median-of-three)法。即取三个关键字先进行排序,将中间数作为枢轴,一般是取左端、右...原创 2017-05-11 10:52:02 · 1387 阅读 · 0 评论 -
归并排序(Merge Sort)递归、非递归 Java实现
归并排序与堆排序充分利用了完全二叉树的深度为logn + 1的特性,因而效率比较高。归并排序(Merge Sort)归并排序(Merge Sort)就是利用归并的思想表现的排序方法。它的原理是假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到[n/2]([x]表示不小于x的最小整数)个长度为2或1的有序子序列;再两两归并,……,原创 2017-05-08 13:33:53 · 2495 阅读 · 0 评论 -
冒泡排序算法(Bubble Sort) Java实现
冒泡排序的基本思想:两两相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。import java.util.Arrays;import java.util.Random;/** * 冒泡排序 * */public class BubbleSort { /** * 冒泡排序 * * 从0开始往右两两比较,如果左边大于右原创 2017-05-05 16:11:14 · 1226 阅读 · 0 评论 -
简单选择排序算法(Simple Selection Sort) Java实现
简单选择排序算法简单选择排序算法(Simple Selection Sort)就是通过n-1次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1≦i≦n)个记录交换之。import java.util.Arrays;import java.util.Random;/** * 简单选择排序算法 * */public class SimpleSelect原创 2017-05-05 16:14:19 · 893 阅读 · 0 评论 -
直接插入排序算法(Straight Insertion Sort) Java实现
直接插入排序算法直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表import java.util.Arrays;import java.util.Random;/** * 直接插入排序算法 * * 与冒泡、简单排序时间复杂度相同,但是比后两者性能要好 * * 数组下标为0原创 2017-05-05 16:24:17 · 656 阅读 · 0 评论 -
希尔排序算法(Shell Sort) Java实现
希尔排序(Shell Sort)是对直接插入排序改进后的版本,可以增加效率所谓基本有序,就是小的关键字基本在前面,大的基本在后面,不大不小的基本在中间。将相距某个“增量”的记录组成一个子序列,这样才能保证在子序列内分别进行直接插入排序后得到的结果是基本有序而不是局部有序import java.util.Arrays;import java.util.R原创 2017-05-05 16:29:24 · 669 阅读 · 0 评论 -
堆排序算法(Heap Sort) Java实现
堆(Heap)堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如果按照层序遍历的方式给结点从1开始编号,则结点之间满足如下关系:堆排序(Heap Sort)堆排序就是利用堆(假设利用大顶堆)进行排序的方法。它的基本思想是,将待排序的序列构造成一个大顶堆。此时,整个序列的最大原创 2017-05-05 16:37:33 · 637 阅读 · 0 评论 -
排序算法总结
排序的稳定性经过对总分的降序排序后,总分高的排在前列。,此时对于令狐冲和张无忌而言,未排序时是令狐冲在前,那么他们总分排序后,分数相等的令狐冲依然应该在前,这样才算是稳定的排序,如果他们二者颠倒了,则此排序是不稳定的了。排序算法总结根据排序过程中借助的主要操作,我们将内排序分为:插入排序、交换排序、选择排序和归并排序四类。将七种算法的各种指标进行对比原创 2017-05-11 13:43:46 · 402 阅读 · 0 评论 -
平衡二叉树(AVL树)算法 Java实现
定义:平衡二叉树(Self-Balancing Binary Search Tree 或 Height-Balanced Binary Search Tree),是一种二叉排序树,其中每一个结点的左子树和右子树的高度差至多等于1。将二叉树上结点的左子树深度减去右子树深度的值称为平衡因子BF(balance Factor)。那么平衡二叉树上所有结点的平衡因子只可能是-1,0和1.距离插入原创 2017-04-05 15:36:15 · 1175 阅读 · 0 评论 -
KMP算法 Java实现
实现原理参考:https://news.cnblogs.com/n/176771/总觉得获取next数组(部分匹配表)的时间复杂度不太好正文:字符串匹配是计算机的基本任务之一。举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"?许多算法可以完成这个任务,Knuth-Morris-原创 2017-05-13 19:10:13 · 627 阅读 · 0 评论 -
二叉排序树(Binary Sort Tree)查找、插入、删除 Java实现
顺序存储的插入和删除可以通过在表末端插入和删除元素同最后一个元素互换来保持高效率,但是无序造成查找的效率很低。如果查找的数据表是有序线性表,并且是顺序存储的,查找可以折半、插值、斐波那契等查找算法来实现,但是因为有序在插入和删除操作上,就需要耗费大量时间。二叉排序树可以使得插入和删除的效率不错,又可以比较高效率地实现查找。二叉排序树(Binary Sort Tree),又称为二原创 2017-03-30 15:19:32 · 2966 阅读 · 2 评论 -
关键路径算法 Java实现
如果要对一个流程图活的最短时间,就必须分析他们的拓扑关系,并且找到当中最关键的流程,这个流程的时间就是最短时间AOE网(Activity On Edge Network): * 在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,用边上的权值表示活动的持续时间。 * 注:与AOV网不同的是,AOV网是顶点表示活动的网,它值描述活动之间的制约关系,而AOE网是用边表示活动原创 2017-03-09 14:51:45 · 5918 阅读 · 8 评论 -
魔术师发牌 Java实现
魔术师发牌问题 问题描述:魔术师利用一副牌中的13张黑牌,预先将他们排好后叠放在一起,牌面朝下。对观众说:“我不看牌,只数数就可以猜到每张牌是什么,我大声数数,你们听,不信?现场演示。”魔术师将最上面的那张牌数为1,把他翻过来正好是黑桃A,将黑桃A放在桌子上,第二次数1,2,将第一张牌放在这些牌的下面,将第二张牌翻过来,正好是黑桃2,也将它放在桌子上这样依次进行将13张原创 2017-01-05 15:05:20 · 645 阅读 · 0 评论 -
汉诺塔问题 Java实现
汉诺塔3个柱子 a b c 要把盘子从a 移到c上1. 先将前63个盘子移动到b上,确保大盘在小盘下。2.再将最底下的第64个盘子移动到c上。3. 最后将b上的63个盘子移动到c上。实现图解思路:1.移动一个 直接从 要移动的塔 移动到目标塔即可2.移动两个需要借助中间塔才能从 要移动的塔移动到目标塔3.移动两个以上的 可以使用递归的思想 最后成为移原创 2017-01-10 15:22:17 · 644 阅读 · 0 评论 -
马踏棋盘算法 Java实现
马在某个点最多可能有8种走法,用递归和回溯实现。注:代码中,查找下一个可走坐标是从右下第一个开始的,也就是图中的4。可以通过修改a,b...h的值来改变顺序。/** * 马踏棋盘算法 * 递归和回溯 * */public class HorseStep { public static int X = 8; public static int Y = 8;原创 2017-02-06 10:25:04 · 2303 阅读 · 0 评论 -
二叉树的构建及遍历 Java实现
有一些博客构建出来的二叉树是完全二叉树,这篇博客什么样的二叉树都能构建图为代码所示的一棵二叉树public class BinaryTree { private static String [] array = {"A","B","D","H","","","I","","","E","","J","","", "C","F","","K","","","G","","原创 2017-01-17 14:50:32 · 732 阅读 · 0 评论 -
线索二叉树(中序) Java实现
代码所示为下图二叉树中序遍历:CBDAEFC,D,F有两个空指针域,E有一个步骤如下:1.创建二叉树2.创建头结点3.中序遍历线索化4.中序遍历此线索二叉树(非递归方式)public class ThreadedBinaryTree { private static String [] array = {"A","B","C","","",原创 2017-01-19 09:20:37 · 808 阅读 · 0 评论 -
弗洛伊德(Floyd)算法 Java实现
代码所示图:图1:图2:代码:public class ShortestPathFloyd { /** 邻接矩阵 */ private int[][] matrix; /** 表示正无穷 */ private int MAX_WEIGHT = Integer.MAX_VALUE; /**路径矩阵*/ private原创 2017-02-28 14:50:57 · 4396 阅读 · 1 评论 -
拓扑排序(TopologicalSort) Java实现
在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称之为AOV网(Active On Vertex Network)AOV网不能存在回路拓扑排序含义设G=(V,E)是一个具有n个顶点的有向图,V中的顶点序列V1,V2,....,Vn满足若从顶点Vi到Vj有一条路径,则在顶点序列中顶点Vi必在顶点Vj之前。则我们称这样的顶点序列为一原创 2017-03-01 16:03:35 · 3150 阅读 · 1 评论 -
普里姆(Prim)算法 Java实现(最小生成树)
个人认为此算法遍历顺序的决定条件:1.确定第一个顶点2.下一个顶点可到(小于正无穷)3.取可到顶点中最小权值的一个代码中的图最小生成树:99代码(参考其他文章):public class MinSpanTree { /** 邻接矩阵*/ int[][] matrix; /** 表示正无穷*/ int MAX原创 2017-02-21 09:13:41 · 2756 阅读 · 0 评论 -
克鲁斯卡尔(Kruskal)算法 Java实现(最小生成树)
判断是否为回路的机制没有理解代码所示图和边集数组代码public class MiniSpanTreeKruskal { /** 邻接矩阵 */ private int[][] matrix; /** 表示正无穷 */ private int MAX_WEIGHT = Integer.MAX_VALUE; /**边集数组*/ p原创 2017-02-21 16:41:06 · 3504 阅读 · 0 评论 -
迪杰斯特拉(Dijkstra)算法 Java实现(最短路径)
基本思想 通过Dijkstra计算图G中的最短路径时,需要指定起点vs(即从顶点vs开始计算)。 此外,引进两个集合S和U。S的作用是记录已求出最短路径的顶点,而U则是记录还未求出最短路径的顶点(以及该顶点到起点vs的距离)。 初始时,S中只有起点vs;U中是除vs之外的顶点,并且U中顶点的路径是"起点vs到该顶点的路径"。然后,从U中找出路径最短的原创 2017-02-24 13:48:00 · 13351 阅读 · 10 评论