数据结构与算法
文章平均质量分 66
lingeors
这个作者很懒,什么都没留下…
展开
-
判断一个数是否是质数
判断一个数是否是质数最暴力的解法利用质数的性质:设i为质数,则i只能被 1 和 i整除。因此对于i,我们可以令 2..i-1 依次除以i,如果均不能被整除,则说明是质数。代码如下private static boolean isPrime1(int nr) { for (int i = 2; i < nr; i++) { if (nr % i == 0) return原创 2017-02-21 16:40:36 · 3242 阅读 · 0 评论 -
二叉查找树
二叉查找树 吐槽下,csdn的markdown有点虚二叉树是一种很有趣的数据结构,因为大多数情况下它都够简单,却相当强大。今天回顾下一种相对来说比较简单但又非常有用的数据结构–二叉查找树。同时给出c实现和Java的完整实现 树 树是一种数据结构,一棵树是n个节点和n-1条边的集合(这个后面解释) 1. 一棵树有这样的特点:一个节点可以有0个或多个子节点没有父节点的节点称为根结点每原创 2017-02-17 01:38:13 · 332 阅读 · 0 评论 -
归并排序
归并排序归并排序,即把一个数组分成两部分,然后对这两部分分别排序,在将这两个数组归并为一个有序数组。这几乎就是归并排序的全部内容:拆分数组-子数组排序-合并数组。同样的,我们先来看一个实例。 对于数组 a = [5 9 0 7 1 10],取 i = 0, j = a.length-1 = 5, mid = (i+j) / 2 = 2。 1. 先将该数组拆分成两个子数组(根据 mid),分别为原创 2017-02-15 09:28:54 · 346 阅读 · 0 评论 -
快速排序
快速排序先看个例子: 对于数组 a = [427 353 112 914 141 555 96 696 294 883],我们选择tmp = a[0]作为我们的枢纽元,在实现第一轮排序后,我们要实现的效果是数组a分成两部分,前面的部分元素全部小于等于**tmp,后面部分全部大于等于**tmp。取i = 0; j = a.length-1; tmp = a[0]第一轮排序过程如下原创 2017-02-13 09:28:48 · 223 阅读 · 0 评论 -
希尔排序
shellShort插入排序希尔排序是插入排序的改进版本,它以插入排序为基础。在了解希尔排序前,我们有必要先简单了解插入排序。插入排序很简单,它假定数组的前i个元素是有序的,然后将第 i+1 个元素插入到 0-i 中的正确位置上。假设第 i+1 个元素将插入到 j 位置,则 j~i 中的元素需要依次移动到 j+1 ~ i+1 的位置上。如 a = [5 9 0 7 1 10 1 7 3 4],在原创 2017-02-14 01:18:26 · 345 阅读 · 0 评论 -
跳台阶问题
今天看到一道有趣的题目,如下 一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。求总共有多少总跳法,并分析算法的时间复杂度说它有趣,纯粹是因为看题目的时候看错了,把只能跳1级和2级看成了可以跳任意级,由此也得出了一个通解,虽然也比较简单,但挺有趣的。 按照原题,只要稍微列出几项便可以发现这其实是一个斐波那契数列,按照公式 n[i] = n[i-1]+n[i-2] 即可得出结果。 而如果不限原创 2017-03-10 00:31:58 · 319 阅读 · 0 评论 -
AVL树
之前我们提到了二叉查找树,我们说过它是一种既简单又有趣的数据结构,它足够强大,也足够简洁,但这有个先决条件,插入的数值足够随机,否则二叉查找树的很容易失衡(或者数值足够随机,但在不断的删除操作后,也会发生失衡情况),比如当我们使用一个有序数组生成一棵二叉树查找树时,实际上相当于生成了链表,查找的时间复杂度为O(n),这显然和我们的想要的存在比较大的差距(O(logn))。因此,实际二叉查找树的实现都原创 2017-03-15 00:31:20 · 277 阅读 · 0 评论