
算法
张康瑞
翻过这座山,让他们听到你的声音。
展开
-
算法__判断链表中是否有环,并找入环对象
链表:是不基于物理连接的列表,是靠前对象引用后边对象组成一串对象。(如下) 链表中出现了环,就是我们中的最后一个引用又指回了链中的一个对象。(如下)我们就是想判断出链表中是否有环,不判断的话,我们就可能在取链中数据时进入死循环。该如何判断这个列表中是否有环,只要我们判断在这个链子是否有相同的指向。也就是两个对象的next指的对象一样。先写个对象publ...原创 2019-08-13 17:12:33 · 192 阅读 · 0 评论 -
算法__归并排序
归并排序:利用递归与分治技术将数据序列划分成为越来越小的半子表,在对半子表排序后,再用递归方法将排好的半子表合成为越来越大的有序序列。例子:8 2 1 6 5 7 4 3 拆分: 左子树:8 2 1 6 右子树:5 7 4 9 继续拆分: 左子树:8...原创 2019-09-07 20:25:33 · 221 阅读 · 0 评论 -
算法__排序总结
排序是将一组乱的数据按一定准则排好顺序。一般按照时间复杂度大概分为三类: 一: O(n^2) 冒泡排序,选择排序,插入排序,希尔排序(性能优于O(n^2),差于O(nlog)); 二: O(nlogn) 快速排序,归并排序,堆排序; 三:O(n) 基数排序,桶排序,计数排序。根据其稳定性:稳定排序和不稳定排序。 ...原创 2019-09-07 23:49:45 · 478 阅读 · 2 评论 -
算法__希尔排序
希尔排序:插入排序的一种优化排序算法,把待排序的数组按一定数量的分组,对每组使用直接插入排序算法排序;然后再缩小数量继续分组排序,直至整个数组分成一组,排序完成。例子:5 2 6 7 9 1 3 4 选择增量gap=length/2,缩小增量继续gap=gap/2,最后形成的增量序列为:4,2,1。第一次增量为4:即:坐标相差4的元素进行插...原创 2019-09-07 17:16:24 · 184 阅读 · 0 评论 -
算法__插入排序
插入排序:就是将数据插入到已经排好序的数列中,使得最终的数列顺序正确。举个例子:5 8 3 5 2 第一轮:这个数组,我们可以先把 5 这个第一位数字视为已经排好的数列,将8加入顺序排好的队列中。1. 8和5做比较,8大于5,所以8排在5右边;5 8 3 5 2 第二轮:现在 5 8 就是已经排好的数组,将3插入...原创 2019-08-27 01:33:31 · 239 阅读 · 0 评论 -
算法__选择排序
之前写到过冒泡排序。但是,冒泡排序需要一个个比较,交换位置。这样会有很多的读写操作,会影响cpu效率。所以,出现了选择排序。选择排序,每次循环选择最小的数字与这次循环的第一位置的数字,交换位置,直至最后。举个例子,说明一下:7 2 5 1 3 4 8 6 第一轮: 1. 7 和2比较,2小,最小变量minNumber=...原创 2019-08-27 01:11:53 · 188 阅读 · 0 评论 -
算法__快速排序
快速排序:选择一个基数,分别从数组的左边和右边与基数比较,大的放在基数的右边,小的放在基数左边。然后,再在基数的左右选择基数排序直至最后数组排序好。快速排序右两种实现:占坑法和互换法。占坑法:4 7 3 5 2 6 1 8 选择基数(我们一般选择第一个数位基数) pivote=4,两个指针 left =>4,right =>8。...原创 2019-08-16 16:51:56 · 248 阅读 · 0 评论 -
算法__优先队列
最大优先队列:无论入队顺序,最大的数字先出队;最小优先队列:无论入队顺序,最小的数字先出队;7 5 4 2 3 1 二叉树:插入一个数字 8: 8 大于 4,4和8交换; 8 大于7 ,8和7交换。代码如下:/** * 优先排序(最大优先队列) */public class TestPro { ...原创 2019-08-20 20:45:52 · 380 阅读 · 0 评论 -
算法__堆排序
二叉堆是一种完全二叉树,堆可以分为最大堆和最小堆。最大堆:父节点的值都大于两子节点的值;最小堆:父节点的值都小于子节点的值。图中就是一个最大堆。1.那一组数据如何成为一个最大堆呢7 1 3 10 5 2 8 9 6 先将它弄成二叉树看看:我们先看一下 10这个数字,它比它的子节点都大,但是大于父节点。所以,我们得将...原创 2019-08-20 20:25:59 · 231 阅读 · 0 评论 -
算法__鸡尾酒排序
鸡尾酒排序:鸡尾酒排序是冒泡排序的升级,冒泡排序在第一轮比较完之后,会从0位继续比较;鸡尾酒排序是在第一轮排序完之后从尾部往前比较。举个例子:2 3 4 5 6 7 8 1 冒泡排序: 第一轮:1. 2和3比较,不交换; 2. 2和4比较,不交换; ...原创 2019-08-15 16:47:19 · 248 阅读 · 0 评论 -
算法__冒泡排序
冒泡排序:从数组的0位置开始往右开始一个个比较大小,如果坐标小的数大于坐标大的数,则两个坐标的数交换,然后再和下一个数比较,直至整个循环完则顺序排好。直接举个例子:5 2 3 1 6 7 9 8 第一轮: 1. 5和2比较,5大于2,则5和2交换 2 5 3 1 6...原创 2019-08-15 14:48:26 · 218 阅读 · 0 评论 -
算法__桶排序
上一次的计数排序不能对浮点数排序,所以有了桶排序。桶排序:新建一个集合,每个元素中是一个集合来存储一个局域的数,然后遍历这个集合。2.5 1.3 3.6 0.3 5.5 桶的数量:可以是数的个数。桶的区域 = (最大数 - 最小数)/ (桶的个数 - 1) = (5.5 - 0.3)/ 4 = 1.3如图所示,最后一个只...原创 2019-08-19 18:53:10 · 263 阅读 · 0 评论 -
算法__计数排序法
计数排序法:用一个数组从小到大记录数组中相应大小数的次数,然后遍历这个数组记录的次数排序。91 95 99 94 96 91 92 93 1. 创建一个数组记录相应数字出现次数的数组; 数组的大小 = 最大数字 -最小数字 +1; size = 99 - 91 + 1 = 9;2. 遍历数组,用新数组记录次数;(用最小的数 ...原创 2019-08-19 16:54:39 · 376 阅读 · 0 评论 -
算法__判断一个整数是否是2的乘方
问题一:实现一个方法,判断一个正整数是否是2的乘方(比如16是2的4次方,返回True;18不是2的乘方,返回False)。解:二进制数的每一位都是2的乘方,也就是说每一个2的乘方的二进制都是第一位是个1,剩下的都是0。比如: 16:10000; 32:100000。 再看一下整数减1,比如: 15:01111; 31:011111; ...原创 2019-08-14 12:20:41 · 420 阅读 · 0 评论 -
算法__寻找缺失的整数
题目一:一个无序数组里有99个不重复的正整数,范围1到100,唯独缺少一位整数,找出这个整数。解:求出1到100的所有数的和减去数组中数的和就是缺失的数。public int thisNumber(int[] a) { int s = 100 * 101 >> 1; int size = a.length; for (int i = 0; i <...原创 2019-08-13 19:52:53 · 515 阅读 · 0 评论 -
算法__求最大公约数
我们在小学时候就学过好几种求最大公约数的方法:辗转相除法,更相减损法,短除法。辗转相除法:是用较大的数除以较小的数。如果整除则较小的数就是这两个数的最大公约数,如果没有的话,就用较小的数和余数中大的数除以两个数中较小的数,直至整除为止,最后的除数就是最大公约数。更相减损法:先判断两个数是否为偶数,如果是的话先除以2,然后较大的数减去较小的数,直到减数和值相等为止。最后的值再乘以约掉的2的个...原创 2019-08-13 17:49:47 · 196 阅读 · 0 评论 -
算法__基数排序
基数排序:按照从右往左的顺序,依次将每一位都当作一次关键字,然后按照该关键字对数组排序,同时每一轮排序都基于上轮排序后的结果;当将所有的位排序完之后,整个数组都达到了有序状态。基数是什么呢?对于十进制整数,每一位都可能是0~9其中的某一个,总共10种可能,那10就是它的基数。同理二进制数字基数为2,字符串,如果使用的是8位的扩展ASCII字符集,那么基数是256.例子:给个原始数组 ...原创 2019-09-07 23:49:35 · 278 阅读 · 0 评论