Cirry's Blog

《算法图解》是一本科普读物

Feb 2, 2024
阅读
4分钟
715字

看完了这本书之后,我更觉得《算法图解》是一本算法科普书。

如果你想学习算法,这本书是不适合的,如果你只想了解一下算法,这本书是不错的。

前面部分介绍了一些简单的算法知识,后面说了一些复杂的算法和有趣的问题,供读者自己去深入研究算法问题。

二分法查找

  • 二分法查找是利用了有序数组的特点,通过比较元素的大小,减少查找的次数。
  • 二分法查找的复杂度为 \( O(log_2 n) \)。

js实现:

function binarySearch(arr, target) {
let low = 0;
let high = arr.length - 1;
while (low <= high) {
let mid = Math.floor((low + high) / 2);
let guess = arr[mid];
if (guess === target) {
return mid; // 找到目标值,返回索引
} else if (guess < target) {
low = mid + 1; // 目标值在右侧
} else {
high = mid - 1; // 目标值在左侧
}
16 collapsed lines
}
return -1; // 未找到目标值
}
// 示例
const sortedArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const targetValue = 6;
const result = binarySearch(sortedArray, targetValue);
if (result !== -1) {
console.log(`目标值 ${targetValue} 在数组中的索引是: ${result}`);
} else {
console.log(`未找到目标值 ${targetValue}`);
}

选择排序

function selectionSort(arr) {
const n = arr.length;
for (let i = 0; i < n - 1; i++) {
// 假设当前位置的元素是最小的
let minIndex = i;
// 在未排序部分找到最小元素的索引
for (let j = i + 1; j < n; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
// 将最小元素与当前位置交换
12 collapsed lines
if (minIndex !== i) {
[arr[i], arr[minIndex]] = [arr[minIndex], arr[i]];
}
}
return arr;
}
// 示例用法
const unsortedArray = [64, 25, 12, 22, 11];
const sortedArray = selectionSort(unsortedArray.slice());
console.log(sortedArray); // 输出 [11, 12, 22, 25, 64]

快速排序

function quickSort(arr) {
if (arr.length <= 1) {
return arr; // 数组已经有序
}
const pivot = arr[0]; // 选择第一个元素作为基准
const left = [];
const right = [];
for (let i = 1; i < arr.length; i++) {
if (arr[i] < pivot) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
10 collapsed lines
}
// 递归排序左右子数组,然后合并
return quickSort(left).concat(pivot, quickSort(right));
}
// 示例用法
const unsortedArray = [64, 25, 12, 22, 11];
const sortedArray = quickSort(unsortedArray.slice());
console.log(sortedArray); // 输出 [11, 12, 22, 25, 64]

递归

// 计算阶乘的递归函数
function factorial(n) {
// 基本情况:当 n 为 0 或 1 时,阶乘为 1
if (n === 0 || n === 1) {
return 1;
} else {
// 递归情况:n 的阶乘等于 n 乘以 (n-1) 的阶乘
return n * factorial(n - 1);
}
}
// 示例用法
const result = factorial(5);
console.log(result); // 输出 120

五种常见的时间复杂度

由快到慢排序:

  • \(O(log_n)\)
  • \(O(n)\)
  • \(O(n*log_n)\)
  • \(O(n^2)\)
  • \(O(n!)\)

补充:

  • \( log_2 n \)代表中多少个2相乘等于n。

问题:

  • js中关于数组、栈、队列、散列表的实现
  • 如果你对数据库或高级数据结构感兴趣,请研究如下数据结构:B树,红黑树,堆,伸展树。
本文标题:《算法图解》是一本科普读物
文章作者:Cirry
发布时间:Feb 2, 2024
感谢大佬送来的咖啡☕
alipayQRCode
wechatQRCode
总访问量
总访客数人次