算法篇
算法种类
- 排序算法:包括冒泡排序、选择排序、插入排序、归并排序和快速排序等。
- 查找算法:包括线性查找、二分查找和哈希查找等。
- 图形算法:包括广度优先搜索、深度优先搜索和最短路径算法等。
- 字符串算法:包括朴素字符串匹配算法、KMP算法和Boyer-Moore算法等。
- 数学算法:包括质数判定、最大公约数、最小公倍数、求幂、求余、阶乘等。
- 递归算法:包括斐波那契数列、汉诺塔、八皇后等。
- 动态规划算法:包括背包问题、最长公共子序列等。
- 贪心算法:包括零钱兑换问题等。
排序算法
冒泡排序
冒泡排序是一种基本的排序算法,它通过多次遍历数组,比较相邻元素的大小,并交换它们的位置,将最大或最小的元素逐渐“冒泡”到数组的一端,直到整个数组排序完成。
function bubbleSort(arr) {
const len = arr.length;
for (let i = 0; i < len - 1; i++) {
for (let j = 0; j < len - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
}
}
}
return arr;
}
理解
该方法的原理是,对于一个包含N个元素的数组,将比较相邻元素的大小,并将较大的元素往后移,重复多轮这个过程,最后得到一个递增的有序数组。时间复杂度为O(n^2),比较低效。
具体实现方式如下:
- 获取数组元素的个数,存储在变量 len 中。
- 对于数组中的每一个元素,分别与其后面相邻的元素进行比较,如果当前元素的值比相邻元素的值大,则交换它们。
- 每执行完一轮比较,都会有一个当前无序数组中最大值沉底。为了减少比较次数,每轮比较后下一轮比较将不再考虑之前已排好序的元素,因此内循环的结束位置是 len-i-1。
- 重复第2步和第3步,直到整个数组被排序。
最后,返回已排序的数组。
例如,对数组 [5, 3, 8, 4, 2] 进行冒泡排序。首先执行第一轮比较,由于5>3,因此将它们的位置交换。得到新的数组 [3, 5, 8, 4, 2]。再继续进行第二轮比较,可以得到数组 [3, 5, 4, 8, 2]。以此类推,最终得到有序数组 [2, 3, 4, 5, 8]。
选择排序
选择排序是一种较简单的排序算法,它的基本思想是在未排序的元素中选择最小/最大的元素,放到已排序的末尾,直到所有元素都排序完毕。
function selectionSort(arr) {
let len = arr.length
for(let i = 0; i < len - 1; i++) {
let minIndex = i
for(let j = i + 1; j < len; j++) {
if(arr[j] < arr[minIndex]) {
minIndex = j
}
}
if(minIndex !== i) {
[arr[i], arr[minIndex]] = [arr[minIndex], arr[i]]
}
}
return arr
}
理解
首先定义一个selectionSort函数,接收一个未排序的数组arr作为参数。然后定义变量len来保存数组的长度。
接着进行两层循环:外层循环遍历整个数组,内层循环从当前元素之后的元素中寻找最小值。
找到最小值后,如果当前元素不是最小值,则在当前元素和最小值之间进行交换。
最后返回已经排序好的数组。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通