
算法
吃西瓜的鱼
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
KMP算法
理论篇 KMP用来字符串匹配的。 首先明白 前缀 后缀。 比如 aabaabaaf。 前缀:不包含最后一个字符的字符串 即:a、aa.aab.aaba.aabaa.aabaab.aabaaba.aabaabaa 后缀:不包含开口字符的字符串 即:f.af.aaf.baaf.abaaf.aabaaf.baabaaf.abaabaf 明白这个之后,就是next数组。 next数组就是一个 对应表。 即前后缀最大相等的个数 从数组第0个元素开始,一直到数组结束。 a----0 aa----1 aab----0原创 2021-03-20 19:54:23 · 73 阅读 · 0 评论 -
堆排序
堆排序,运用二叉树的思想。 (这里是升序)首先是将数组变成大顶堆,大顶堆,也就是节点要大于左右孩子节点的值。 这就要一个方法。 搞定之后,找到最大值。 然后,将最大值和最小值,进行交换,然后,在进行一次新的大顶堆排列(要记得比上次减少一个,因为要把最大值取出来) 然后,不断遍历下, 就会将、数组变成有序的。 下面上代码 package com.bai.tree; import java.util.Arrays; public class HeapSort { public static void原创 2021-02-12 13:48:44 · 110 阅读 · 1 评论 -
基数排序
基数排序,运用什么思想呢?用空间换时间 首先,创建一个类,类里面传一个数组,然后,在怎么办? 之后,就该分类,也就是按照数组里得个位十位百位的具体的数值,将其分配到对应的0,1,2,3下。 也就是说,我们要新建一个二维数组,用来存放临时数据。 存放完之后,将其,放入到原来的数组中,再将临时数组置空。 这样循环下来,按照最大位数的大小,也就是有几位,就循环几次,几次下来,也就排序完成了。 当然,也要小心一下数组越界的情况,可能你的位数分配的不均匀,也就是,你的个位十位数太多了,导致数组越界的情况,根据实际情况原创 2021-02-03 12:29:05 · 96 阅读 · 0 评论 -
归并排序
归并排序,用的是递归思想,分而治之。 简单来说,就是把数组分成有序的两份,然后,对两份的头元素进行比较,谁小,谁就进入,这个新数组。 然后,小的那个数组,下标往后挪一位,接着跟那个数组的头元素比较,直到一个数组没有元素,然后将剩余的那个数组的剩余元素,直接加入到新数组当中。 package com.bai.sort; import java.util.Arrays; public class MergeSort { public static void main(String[] args) {原创 2021-02-02 14:04:48 · 78 阅读 · 0 评论 -
快速排序
快速排序,运用递归的思想,首先确定一个标准数,然后,确定首尾指针。像这样 start是首个数,low指向数组的首个下标,而high指向数组的尾下标。 然后开始遍历。 从尾开始,找比start小的,找到了放到start的位置。 也就是用arr[high]和start作比较。 找到之后在赋值,如果没有找到就往前走一步, 也就是high–; 第一步如下: 右边找到之后,就从做左边再找。 从左边找比基准数大的数,也就是>start的数。 找到了,就将其赋给high,然后再换右边。 如果没有找到,就往前走一原创 2021-02-02 11:13:42 · 77 阅读 · 0 评论 -
希尔排序
希尔排序,就是定步长,分组,比较。 package com.bai.sort; import java.util.Arrays; public class ShellSort { public static void main(String[] args) { int[] arr = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0}; sort(arr); } public static void sort(int[] arr) {原创 2021-02-01 09:29:23 · 94 阅读 · 0 评论 -
用单链表来实现栈结构
package com.bai.stack; public class LinkedStackDemo { public static void main(String[] args) { LinkStack linkStack1 = new LinkStack(1); LinkStack linkStack2 = new LinkStack(2); LinkStack linkStack3 = new LinkStack(3);原创 2021-01-22 11:35:28 · 177 阅读 · 2 评论 -
插入排序
思想:首先,先确定一个有序序列,然后把后面的数都往里插。 也就是,你把第一个数当做有序,然后把第二个数和第一个数比较,如果,第二个数大于第一个数,就不变,如果第二个数小于第一个数,就进行交换。 然后,在比较第三个数,看第三个数和第二个数比较,如果小,再去和第一个比较。 也就是说,这个要用到两个循环,第一个for循环,用来遍历取得数,第二个while循环,用来做比较。 搞清楚思路之后,就可以上代码了 package com.bai.sort; import java.util.Arrays; public原创 2021-01-31 11:35:34 · 71 阅读 · 0 评论 -
选择排序
选择排序呢,就跟冒泡排序有点像,但是又不太一样,因为他不用一直换。循环完毕之后,才会换。 package com.bai.sort; import java.lang.reflect.Array; import java.util.Arrays; public class SelectSort { public static void main(String[] args) { int[] array = {101,34,119,1}; selectSort(ar原创 2021-01-31 10:08:26 · 74 阅读 · 0 评论 -
八皇后 递归 回溯 详解
debug一上午的八皇后,一直纠结他是怎么回溯的,后来画个图,终于搞懂了。 首先搞懂递归的概念。 它是一直在for,直到走不通,退出,接着上一个循环接着走。 直接上图 直到它有一个结果不行了,在这个程序里,第一个回溯的,就是n5的时候,没有结果,回溯到n4,再往下找,将n4遍历完成,发现有一个可以使用,接着n5,结果发现还是不行,再找。 怎么算回溯呢? 在这里面,就是,你走完一个for循环,接着上次再走。 最好自己去画个图,再debug一下,啥都懂了。 package com.bai.recursion;原创 2021-01-29 12:40:54 · 296 阅读 · 1 评论