算法篇

算法种类

  1. 排序算法:包括冒泡排序、选择排序、插入排序、归并排序和快速排序等。
  2. 查找算法:包括线性查找、二分查找和哈希查找等。
  3. 图形算法:包括广度优先搜索、深度优先搜索和最短路径算法等。
  4. 字符串算法:包括朴素字符串匹配算法、KMP算法和Boyer-Moore算法等。
  5. 数学算法:包括质数判定、最大公约数、最小公倍数、求幂、求余、阶乘等。
  6. 递归算法:包括斐波那契数列、汉诺塔、八皇后等。
  7. 动态规划算法:包括背包问题、最长公共子序列等。
  8. 贪心算法:包括零钱兑换问题等。

排序算法

冒泡排序

冒泡排序是一种基本的排序算法,它通过多次遍历数组,比较相邻元素的大小,并交换它们的位置,将最大或最小的元素逐渐“冒泡”到数组的一端,直到整个数组排序完成。

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),比较低效。
具体实现方式如下:

  1. 获取数组元素的个数,存储在变量 len 中。
  2. 对于数组中的每一个元素,分别与其后面相邻的元素进行比较,如果当前元素的值比相邻元素的值大,则交换它们。
  3. 每执行完一轮比较,都会有一个当前无序数组中最大值沉底。为了减少比较次数,每轮比较后下一轮比较将不再考虑之前已排好序的元素,因此内循环的结束位置是 len-i-1。
  4. 重复第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来保存数组的长度。
接着进行两层循环:外层循环遍历整个数组,内层循环从当前元素之后的元素中寻找最小值。
找到最小值后,如果当前元素不是最小值,则在当前元素和最小值之间进行交换。
最后返回已经排序好的数组。

posted @   明月南楼  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示