![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 64
lmmg
这个作者很懒,什么都没留下…
展开
-
桶排序理解+相关例题(Java实现)
桶排序原理桶排序是计数排序的扩展版本,计数排序可以看成每个桶只存储相同元素,而桶排序每个桶(桶的类型视情况而定)存储一定范围的元素,通过映射函数(常实现了间接的桶间排序),将待排序数组中的元素映射到各个对应的桶中,对每个桶中的元素进行排序(有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序,也可能不需要排序,视情况而定),再通过一定的算法,将桶中的数据提出出来并转换成有序数组。桶排序需要尽量保证元素分散均匀,否则当所有数据集中在同一个桶中时,桶排序失效。感觉桶排序最主要的是思想,即将各转载 2021-05-05 12:52:17 · 382 阅读 · 0 评论 -
二分查找算法理解+leetcode例题(Java实现)
二分查找算法常需考虑二分终止和区间边界处理,死循环问题。算法解释二分查找可用来查找满足特定条件(第一个>target等)的元素的位置,我们需要依据特定的条件来决定新的左右区间和区间的开闭。二分查找也常被称为二分法或者折半查找,每次查找时通过将待查找区间分成两部分并只取 一部分继续查找,将查找的复杂度大大减少。对于一个长度为 O(n) 的数组,二分查找的时间复 杂度为 O(log n)。具体到代码上,二分查找时区间的左右端取开区间还是闭区间在绝大多数时候都可以,因此 有些初学者会容易搞不原创 2021-05-04 19:46:10 · 452 阅读 · 1 评论 -
双指针算法理解+leetcode例题(Java实现)
双指针算法双指针主要用于遍历数组,两个指针指向不同的元素,从而协同完成任务。也可以延伸到多个数组的多个指针。若两个指针指向同一数组,遍历方向相同且不会相交,则也称为滑动窗口(两个指针包围的区域即为当前的窗口),经常用于区间搜索。若两个指针指向同一数组,但是遍历方向相反,则可以用来进行搜索,待搜索的数组往往是排好序的。数组或字符串中,一般为左右指针,链表中一般为快慢指针。例题167. 两数之和 II - 输入有序数组题解因为数组已经排好序,我们可以采用方向相反的双指针来寻找这两个数字,一原创 2021-05-04 19:34:04 · 1652 阅读 · 3 评论 -
贪心算法理解+leetcode例题(Java)
贪心算法算法解释贪心算法或贪心思想采用贪心的策略,保证每次操作都是局部最优的,从而使最后得到的结果是全局最优的。于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。举一个最简单的例子:小明和小王喜欢吃苹果,小明可以吃五个,小王可以吃三个。已知苹 果园里有吃不完的苹果,求小明和小王一共最多吃多少个苹果。在这个例子中,我们可以选用的 贪心策略为,每个人吃自己能吃的最多数量的苹果,这在每个人身上都是局部最优的。又因为全局结果是局部结果的简单求和,且局部结果原创 2021-05-04 19:31:17 · 341 阅读 · 0 评论 -
选择排序理解(Java实现)
直接选择排序原理每一趟从无序序列中选出最大(或最小)的一个元素,顺序放在后面有序序列的首部,直到全部待排序的数据元素排完。复杂度时间复杂度为O(N^2)代码实现 public void selectSort(int[] nums) { //记录当前无序序列中最大值的索引 int max; //中间变量 int temp; //取出最值的趟数为nums.length-1,因为剩下的最后一个是0号位的数,其原创 2021-05-04 19:29:35 · 49 阅读 · 0 评论 -
冒泡排序理解(Java实现)
冒泡排序思想对比相邻的元素值,如果满足条件就交换元素值,把较小的元素值移动到数组前面,把大的元素值移动到数组后面(也就是交换两个元素的位置),每轮内循环都会把剩余序列中的最大数放到后面,这样数组元素就像气泡一样从底部上升到顶部。算法在双层循环中实现,其中外层循环控制排序轮数,总循环次数为要排序数组的长度减 1。而内层循环主要用于对比相邻元素的大小,以确定是否交换位置,对比和交换次数依排序轮数而减少。代码 public void bubbleSort(int nums[]) {原创 2021-05-04 19:28:00 · 65 阅读 · 0 评论 -
插入排序理解(Java)
插入排序1、原理直接插入排序的基本操作是 将一个记录插入到已经排好的有序表中,从而得到一个新的、记录数增1的有序表。 对于给定的一组记录,初始时假定第一个记录自成一个有序序列,其余记录为无序序列。 接着从第二个记录开始,按照记录的大小依次将当前处理的记录插入到其之前的有序序列中,直到最后一个记录插到有序序列中为止。2、时间复杂度时间复杂度O(n^2),直接插入排序法比冒泡和简单选择排序的性能要好一些。3、java代码 public void insertSort(int[] nums)原创 2021-05-04 19:25:56 · 86 阅读 · 0 评论 -
归并排序理解(Java)
归并排序1、原理归并排序是一种概念上最简单的排序算法,与快速排序一样,归并排序也是基于分治法的。 **归并排序将待排序的元素序列分成两个长度相等的子序列,为每一个子序列排序,然后再将他们合并成一个子序列。**合并两个子序列的过程也就是两路归并。2、复杂度归并排序是一种稳定的排序算法,归并排序的主要问题在于它需要一个与待排序数组一样大的辅助数组空间。由于归并排序每次划分时两个子序列的长度基本一样,所以归并排序最好、最差和平均时间复杂度都是nlog2n。我们可以通过下图非常容易看懂归并排序的过程:原创 2021-05-04 19:23:13 · 91 阅读 · 0 评论 -
快速排序理解(Java)
快速排序(Quicksort)排序算法中快排和归并排序都属于分治算法,分治法的基本思想:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。原理快排基本思想是每次在无序序列选择一个数作为基准数(左端或右端,这里为左端),让小于基准数的放基准数的左边,大于基准数的放基准数的右边,直至序列只剩一个数。让数放到对应位置思路:分配两个哨兵(left,right)指向序列首端和末端,若基准数为左端,则right先动,否则left先动,这里为right先动,right–原创 2021-05-04 19:21:03 · 130 阅读 · 0 评论