算法专栏
用Java语言实现各种常用算法,供大家学习
天哥不爱学习
工作了10年的程序员,PHP python Java 都有所涉猎,过去6年就职于某世界500强企业。
展开
-
欧几里得辗转相除法简介
它是基于这样一个数学原理:两个整数的最大公约数等于其中较小的数和两数的差的最大公约数。2. 用较大的数a除以较小的数b,得到余数r1(即 a = b * q1 + r1,其中q1是商,r1是余数且0≤r1<b)。5. 这个过程会一直持续到某一次的余数为0为止,此时的非零余数前一次的除数就是原来两数a和b的最大公约数。4. 若r1不为0,则将b的值赋给a,将r1的值赋给b,然后重复步骤2和3的过程。1. 假设有两个正整数a和b(假设a>b),我们想要找到它们的最大公约数。因此,18和24的最大公约数是6。原创 2024-01-29 10:05:18 · 923 阅读 · 0 评论 -
算法之K-均值法简介
K-均值算法(K-Means)是一种无监督学习的聚类分析方法,用于将数据集中的样本划分成预设数量(K)的簇(cluster),使得每个簇内的数据点彼此相似度较高,而不同簇之间的数据点差异较大。该算法的目标是最小化簇内平方和(Intra-Cluster Sum of Squares, ICS)或称组内平方误差和(Within-Cluster Sum of Squares, WCSS),即所有数据点到其所属簇中心(质心,centroid)的距离平方之和。2. **迭代过程:****算法流程概述:**原创 2024-01-26 08:00:00 · 674 阅读 · 0 评论 -
网页搜索排名算法简介
佩奇排名(PageRank)算法是由Google的创始人拉里·佩奇(Larry Page)和谢尔盖·布林(Sergey Brin)在1990年代后期提出的一种用于网页排名的计算方法,它是早期Google搜索引擎的核心组成部分。4. **阻尼因子**:为了避免循环和无限递归问题,并模拟用户可能会跳转至任意网页的行为,算法引入了阻尼因子(通常为0.85),意味着一部分“投票”将分散到整个网络中的所有页面,而不仅仅局限于当前页面直接链接的页面。此外,链接数量也是一个考虑因素,但重要的是质量而非单纯的数量。原创 2024-01-25 08:15:00 · 837 阅读 · 0 评论 -
查找算法之二分查找
3. **计算中间索引**: 计算区间的中间元素索引(通常是`low + (high - low) / 2`,其中`low`和`high`分别是当前搜索区间的起始和结束索引)。- 如果目标值大于中间元素,则在数组的右半部分(即从新的中间索引加一到`high`的部分)继续执行二分查找。- 如果目标值小于中间元素,则在数组的左半部分(即从`low`到新的中间索引减一的部分)继续执行二分查找。2. **确定范围**: 设定初始搜索区间为整个数组,即从数组的第一个元素到最后一个元素。原创 2024-01-12 08:30:00 · 453 阅读 · 0 评论 -
排序算法之堆排序
堆是一个特殊的树形数据结构,其中每个节点的值都大于或等于(对于大顶堆)其子节点的值,或者每个节点的值都小于或等于(对于小顶堆)其子节点的值。通过这样的方式,堆排序保证了每次都能将当前未排序序列中的最大(或最小)元素放在正确的位置上,最终完成整个数组的排序。将堆顶元素(即当前未排序部分的最大元素或最小元素,取决于是否是大顶堆还是小顶堆)与数组的最后一个元素进行交换。方法中先构建一个最大堆,再通过循环将堆顶元素(即当前未排序部分的最大元素)与末尾元素交换,最后递归地对剩余部分重建最大堆。1. **构建堆:**原创 2024-01-13 18:13:29 · 727 阅读 · 0 评论 -
排序算法之快速排序
创建两个指针,一个从数组左侧开始(`i` 初始化为 `0` 或 `low`),一个从数组右侧开始(`j` 初始化为 `high-1` 或 `right-1`)。快速排序的基本思想是选择一个数组中的元素作为“基准”(pivot),通过一趟排序将待排数组分割成两个部分(分区操作):左边的元素都不大于基准,右边的元素都大于基准。当 `i` 超过 `j` 时,将基准元素与 `j` 所指的元素交换位置(如果还没这么做的话),此时基准元素在其最终正确位置上,也就是左侧所有元素不大于基准,右侧所有元素不小于基准。原创 2024-01-09 11:30:38 · 502 阅读 · 0 评论 -
排序算法之归并排序
上述代码首先定义了一个mergeSort方法,该方法采用分治策略将数组分为两半分别进行排序,然后调用merge方法将排好序的两部分合并。merge方法中创建了一个临时数组,分别从左右两个已排序的部分取出元素进行比较并放入临时数组,最后将临时数组的内容复制回原数组。归并排序将一个无序数组分割成若干个子数组,然后对子数组进行排序,最后将有序的子数组合并成一个完全有序的序列。它的主要优点是具有稳定的排序性能和较少的额外空间需求。归并排序是一种稳定的排序算法,即相等的元素在排序后保持原来的相对顺序。原创 2024-01-08 10:59:16 · 392 阅读 · 0 评论 -
排序算法之插入排序
它的基本思想是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。具体算法描述如下:从第一个元素开始,该元素可以认为已经被排序。取出下一个元素,在已经排序的元素序列中从后向前扫描。如果该元素(已排序)大于新元素,将该元素移到下一位置。重复步骤3,直到找到已排序的元素小于或者等于新元素的位置。排序后的数组将覆盖原始数组。原创 2024-01-05 14:15:23 · 460 阅读 · 0 评论 -
排序算法之选择性排序
选择排序是不稳定的排序方法,其时间复杂度和空间复杂度均为O(n^2),其中n为待排序元素的个数。外层循环从数组的第一个元素开始,内层循环从数组的第二个元素开始,通过比较找到最小元素的下标。重复这个过程,直到整个数组有序。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。虽然选择排序在处理大数据集时效率较低,但由于其算法简单易懂,实现起来较为容易,因此在一些小规模数据集或者需要快速实现排序算法的场合中,选择排序仍然是一种常用的排序算法。原创 2024-01-04 16:03:14 · 490 阅读 · 0 评论 -
排序算法之冒泡排序
在这个例子中,我们首先定义了一个需要排序的数组array。bubbleSort函数是实现冒泡排序的主要逻辑,其中包含两个嵌套的循环。外层循环遍历整个数组,内层循环对当前未排序的部分进行遍历。如果相邻的两个元素顺序不正确(即arr[j] > arr[j+1]),我们就交换这两个元素的位置。这样,每次内层循环结束后,最大的元素就会被“冒泡”到数组的末尾。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。原创 2024-01-02 11:14:04 · 372 阅读 · 0 评论