算法学习
jiye111
这个作者很懒,什么都没留下…
展开
-
算法学习 《算法》1.5 并查集算法(Union-Find)
并查集算法是简单却又非常实用的一种算法。书上的例子可以非常清楚到位的概括这个算法使用的场景,那就是平面上有n个点,给定一条边既可以将两个点联通起来,现在有大量的这样的边,问最后有多少个连通子图? 以下是并查集算法的功能; 从一堆连接任意两个顶点的边信息中创建并查集 可以查询到任意两个顶点是否连通 对于指定边能够将该边的两个顶点连通起来让他们属于同一个子图 能够找到某一个顶点所在子图的根在...原创 2018-09-12 17:37:50 · 200 阅读 · 0 评论 -
算法学习 《算法》2.1选择排序
工作原理: 首先找到数组中最小的元素,将他和数组的第一个元素交换位置(如果最小是自己就和自己交换)。在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,知道将整个数组排序,这种方法叫做选择排序,因为他一直在选择剩余元素之中的最小者。 根据描述,我们知道,已经排序好的元素位于数组的左侧,每次只是交换位于右边的剩余元素。 代码实现: public class SortMa...原创 2018-09-13 16:32:32 · 187 阅读 · 0 评论 -
算法学习 《算法》2.1 直接插入排序的三种实现方式
工作原理: 每次指定一个待排序的元素,插入到前面已经排序号的序列中去,直到插完所有元素 所以,每次只需要比较指定元素和其左侧的元素大小,交换一定次数即可达到左侧的有序 本文提供三种实现方式:简单实现,减少交换次数的优化,加上哨兵位后的算法。并且在最后面测试这三中算法的效率。 简单版代码实现: public class SortMain { public sta...原创 2018-09-14 09:41:02 · 309 阅读 · 0 评论 -
算法学习 《算法》2.1 希尔排序
工作原理: 由于大规模乱序数组,插入排序的速度很慢,因为他只会交换相邻的元素,所以元素只能一点点的移动。当数组出现极端情况,如最小的值在数组的尽头,要将它挪到首位,就需要N-1次移动。 为此,希尔排序横空出世。 希尔排序的思想,通过交换不相邻的元素,达到对数组的局部进行排序,并最终用插入排序将局部有序的数组排序。 具体:给定一个增量h,对相隔h个的数字进行排序,排序完成后改变h的值,重复这...原创 2018-11-26 21:03:24 · 144 阅读 · 0 评论 -
算法学习 归并排序
工作原理: 分而治之的思想,先对小块的进行排序,再进行大规模的排序,由于小规模的有序,所以在归并时按顺序遍历即可 归并排序的速度稳定在NlogN,因为不管序列如何,都要执行相同的操作。 但是所需要的空间要很多,所以在大规模数据排序,内存却不够的情况下不适合。 时间复杂度:NlogN 递归算法的空间复杂度,只需要创建一个和原来数组一样长的数组,所以为O(N) 非递归算法的空间复杂度,只需...原创 2018-11-30 12:54:49 · 139 阅读 · 0 评论 -
算法学习 快速排序
算法概述: 快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 是分而治之的典型用例,由于使用了递归,所以对于小规模的数据,速度可能还不如快速排序,所以就需要一个标志位,...原创 2018-12-09 12:56:37 · 301 阅读 · 0 评论 -
算法 | 判断是否为回文字符串
问题: 字符串是否为回文字符串,如abcba (单链表储存) 思路: 快慢指针找到中间节点,并且在慢指针移动时改变node的指向。 找到中间节点以后,从中间节点出发,前后遍历比较值 步骤: 1.判断传入节点是否为空,接下来节点是否为空(非空判断) 2.快慢指针移动,快指针正常移动,慢指针在移动时,改变node的指针方向,指向前一个 ...原创 2019-04-11 11:23:24 · 664 阅读 · 0 评论 -
算法 | 单链表的五个常见操作
问题: 1.单链表反转:事先存好下一个节点再改变指针 2.链表中环的检测:快慢指针终会相遇 3.两个有序链表的合并:两个链表各一个指针,比较大小后加到最终的链表中(有点快排的感觉) 4.删除链表倒数第K个节点:转化为删除正数第length-K+1个节点 5.求链表的中间节点:快慢指针 思路都在代码的注释中,做链表的画张图就能更好的关注逻辑,比较直观,所以强烈建议画图来看看指针怎么走。 ...原创 2019-04-11 17:10:02 · 524 阅读 · 0 评论