- 博客(17)
- 收藏
- 关注
原创 斐波拉契法(黄金分割法)查找算法-Java实现
和折半查找一样的,需要找到一个mid,mid将分割出左右两部分,而通过斐波拉契数组的规律f[k]=f[k-1] + f[k-2],可以知道f[k-1] + f[k-2]分别为右左两部分的长度值,通过判断待查找值在mid的左还是右边,再使用对应k值,重新求得mid,就可以和折半一样最后找到待查找数的位置。
2024-01-02 19:56:17
370
原创 二分查找和插值查找-Java实现
思想:二分查找必须是针对有序列表的,二分查找顾名思义,就是说每次查找都将一个数组对半分,拿到中间索引mid,然后通过判断需要查找的值(下面简称value)和mid索引在数组中的值(下面简称中间值)的大小关系,如果value大于中间值,也就是说value的位置将会在中间值的右边,那么就需要向右继续使用二分查找,循环往复最后就可以找到。思想:通过value去动态的生成一个索引值,然后获取数组中对应这个索引值的值,通过类似于二分查找的比较去决定向哪一边查找。先计算起始值到目标值的距离,然后除以起始值到结束值。
2024-01-01 20:44:46
321
原创 基数排序-Java实现
基数排序是桶排序的升级版,一个数无疑是由10个数字构成,因此我们创建十个桶。一个数从个位依次向上位次取数,将取到的这个位次数与桶进行匹配,再将这个数放入桶中整个数组完成放入后,再从0桶依次取出,放入原数组然后重复上面的操作,直到位次取完后,排序完成。也就是说第一轮是对个位数排序,第二轮是对十位数,第三轮是对百位数....
2023-12-31 18:17:40
355
原创 归并排序-Java实现
按照大话数据结构的没写完整~_~,对于处理每次迭代末尾的数组有问题,奇数大小的数组的最后一个元素我无法实现归并,就在完成归并后实现了一个直接插入,理论上增加了一定的时间复杂度,因为要移动数据。然后再两两(两个数组)合并,合并的时候分别遍历对应的元素,选择小的放入temp数组中,遍历合并完成后,如果某个数组中还有元素,直接合并到temp数组末尾,最后将temp数组覆盖原数组。可以使用递归或者迭代的方式来实现,大话数据结构中提到迭代消耗时间更少,并且空间占用更少,是递归的优化。
2023-12-30 23:05:12
404
1
原创 快速排序-Java实现
当我们选择基准值的时候,每次都是选择最左边的值,这显然不是很合理,如果最左边是最大值,那么就会导致,当这个值交换到最右边的时候,整个最左边都是小于基准值的元素,递归树就不平衡。(下图取自大话数据结构)第六轮比较:5>4 交换 [2,1,4, 3 ,7, 5 ,8,6,9] 移动左指针 left:arr[3]:3 right:arr[5]:5。第八轮比较:7>5 交换 [2,1,4,3, 5 , 7 ,8,6,9] 移动右指针 left:arr[4]:5 right:arr[4]:5。
2023-12-29 22:41:33
811
1
原创 希尔排序-交换法和位移法-Java实现
希尔排序实际上可以理解为插入排序的升级版,其中加入了折半的思想 希尔排序思想: 1.对待排序数组进行增量分组,其中每组的大小可以理解为增量(步长) 分组的规律应该是越分组越大,比如数组的长度是 10,第一次除 2 后是 5,第二次除 2 取整就是 2,第三次就是 1,最后不能小于等于 0 得到的这个数,就是需要分多少组 2.每次分组后,对每组的数组进行排序(分为交换排序和位移排序(还有一点需要注意,在上面这个数组中,我们每次都是拿0和前面的依次比较,会让我们觉得是0依次和前面的比较,实际上不一定。
2023-12-27 23:48:09
1061
1
原创 插入排序-Kotlin实现
首先取得一个元素,将其和它前面的元素进行比较,也就是说有一个待插入元素,一个待检查元素,它们之间进行比较,如果待插入元素比待检查元素小,那么待检查元素后移,待检查元素索引前移,取得前一个元素继续进行比较,直到待插入元素比待检查元素大,那么表示合适的位置找到,由于每个比待插入元素大的元素都后移过,因此实际上insertIndex(待检查元素索引)的后一位是可以插入的,可以理解为一个空位,因此就可以将其插入。如果到达数组最前面,也就是索引为-1了还是没找到,那么跳出当前循环,进行插入。
2023-12-26 22:15:43
36
1
原创 选择排序-Kotlin实现
对于一个无序的数组,依次从数组中获得元素,然后从这个元素的后一位开始互相进行比较,在比较的过程中,如果有比当前取到的元素小的数,将其记录下来为min,并记录其索引minIndex,直到数组的末尾,该论循环结束,将当前取的值和比较得出最小的值进行交换。这样最小的值就排列到了数组的前面,循环往复即可完成排序。在交换的时候进行判断,如果minIndex还是取到的值的索引,那么不进行交换。
2023-12-26 22:15:06
66
1
原创 冒泡排序及其优化-Java实现
从内层循环入手,因为每次循环都会找到一个最大的数排在最后,如果是第二次循环,那么最后一位肯定已经是最大的了,不需要再进行比较了,因此内层循环只需要比较 [0, array.length - i -1)次,比如第二次内层循环的时候,外层i是1,那么array.length - i - 1就是3,只需要比较[0, 3),每次取两个数,比较3次即可。外层循环次数为[0,array.length-1),如果数组长度为5,那么只需要循环四次即可,因为四次完成后,第一位肯定是最小的了。
2023-12-26 22:14:18
20
1
原创 Java实现全策略迷宫问题并求最短路径
使用Java中的栈来实现,使用一个循环依次将上下左右作为第一位压入栈中。后续元素压入栈的时候,需要判断栈中是否已经存在,如果不存在就压入。通过for依次传递方向组,解析方向组产生递归分支中需要的参数组。通过调用解迷宫方法,并传递参数组,完成解题。先通过排列获取所有的方向组。
2023-12-25 00:59:48
59
原创 中缀表达式转后缀表达式(逆波兰式)及其运算(多位整数的四则运算)-Java
1.2.3 符号栈不为空,并且符号栈栈顶符号优先级>=这个待入栈符号,那么将栈顶符号出栈到表达式栈,持续出栈到栈顶符号优先级小于这个代入栈符号,或者遇到左括号。* 然后依次将List集合的元素,配合符号栈和表达式List集合,分别压栈出栈和add到集合,避免了后续对表达式栈出栈结果的逆序。* 1.3.2 如果是右括号,依次弹出符号栈的符号到表达式栈,直到遇到左括号,此时需要丢弃这一对左右括号。* 1.2.2 符号栈不为空,栈顶符号优先级小于待入栈符号,那么直接入栈。
2023-12-23 00:25:13
42
1
原创 Java-JDK16的Record
在JDK16中引入了一个特殊的类,Record(记录);其状态不可变,而且公共可读。这个Point的实例字段被称为组件(component)
2023-07-05 22:35:26
195
原创 Java-对象代码块和静态代码块
对象代码块:每个实例被创建的时候,对象代码块中的内容会优先被执行;如果在对象代码块中给实例字段赋值,那么每个实例的这个实例字段都是不一样的。静态代码块:当这个类被加载的时候,静态代码块中的内容就会被执行,并且只执行这一次,不受实例多次创建的影响;
2023-07-05 22:16:15
48
原创 Java-基于类的访问权限
并且,一个类的方法也可以访问这个类的所有对象的私有数据。protected(受保护的):protected修饰符对于同一包中的类和子类是可见的。被protected修饰的成员(字段和方法)可以在同一包中的其他类中访问,也可以在子类中访问。默认访问权限对于同一包中的类是可见的,但对于不同包中的类是不可见的。private(私有的):private修饰符是最严格的访问权限,只有在同一类中才可以访问私有成员(字段和方法)。public(公共的):这是最高级别的访问权限修饰符,对所有类都是可见的。
2023-07-04 21:05:02
551
原创 Java-不要编写返回可变对象引用的访问器方法
可以使用这个方法来设置毫秒数,这样就破坏了封装性。使得当我们没有提供set方法的情况下,也可以修改Date字段的数据。但是这样会产生一个问题,就是这个访问器方法返回的是一个对象,也就会导致当实例化的employee使用getDate方法后,获取到Date字段的引用。因此,我们在设计bean的时候,最好将这种返回可变对象引用的get方法(访问器方法)的内容,修改为返回克隆的对象。在我们创建一个JavaBean的时候,会使用到对象类型的私有字段,并为其提供访问器方法,如getDate();
2023-07-04 17:47:08
95
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人