本页面全面介绍了 Interviews 仓库中涵盖的排序和搜索算法。这些算法是技术面试的关键基础,因为它们展示了计算机科学的基本概念,并经常出现在编程挑战中。有关 DFS 和 BFS 等图特有搜索算法,请参阅图算法。
排序算法以特定顺序(通常是升序或降序)排列元素。排序算法的选择取决于多种因素,包括数据大小、内存限制、稳定性要求和预期数据分布。
来源:README.md:192-228
快速排序是一种分治算法,它从数组中选择一个“枢轴”元素,并根据其他元素是小于还是大于枢轴将其分成两个子数组。然后递归地对子数组进行排序。
时间复杂度
O(n log(n))O(n log(n))O(n²)稳定性: 否
可视化过程
来源:README.md:192-199
归并排序是一种分治算法,它不断将数组分成两半,递归地对两半进行排序,然后合并它们。它在所有情况下都保证O(n log(n))的性能,使其在最坏情况性能至关重要时非常适用。
时间复杂度
O(n log(n))O(n log(n))O(n log(n))稳定性: 是
可视化过程
来源:README.md:201-210
桶排序是一种分布排序算法,它通过将元素分配到多个桶中工作,然后单独对每个桶进行排序(通常使用另一种排序算法),最后连接排序后的桶。
时间复杂度
Ω(n + k)Θ(n + k)O(n²)其中n是元素数量,k是桶的数量。
视觉表示
来源:README.md:212-218
基数排序是一种非比较整数排序算法,它通过处理个位数字来排序数据。它根据每个数字的值将元素分配到桶中,从最低有效位到最高有效位开始。
时间复杂度
Ω(nk)Θ(nk)O(nk)其中n是元素数量,k是最大数字的位数。
来源:README.md:220-228
搜索算法在数据结构中查找目标值。主要分为线性搜索和二分搜索两类。
线性搜索按顺序检查集合中的每个元素,直到找到目标值或到达末尾。
时间复杂度
O(1)(元素在第一位找到)O(n)O(n)(元素不存在或在最后一位)二分搜索通过重复将搜索区间一分为二,在排序数组中查找目标值的位置。该仓库包含针对特定问题的几种二分搜索实现。
时间复杂度
O(1)(元素在中间位置)O(log n)O(log n)可视化过程
该仓库包含针对特定问题的几种二分搜索实现
来源:BinarySearch/closestBinarySearchTreeValue.java, BinarySearch/firstBadVersion.java, BinarySearch/guessNumberHigherOrLower.java, BinarySearch/pow(x,n).java, BinarySearch/sqrt(x).java
在选择算法时,请考虑以下因素:
来源:README.md:330-352
| 算法 | 最佳情况 | 平均情况 | 最坏情况 | Space键 | 稳定 | 原地 |
|---|---|---|---|---|---|---|
| 快速排序 | O(n log n) | O(n log n) | O(n²) | O(log n) | 否 | 是 |
| 归并排序 | O(n log n) | O(n log n) | O(n log n) | O(n) | 是 | 否 |
| 桶排序 | O(n + k) | O(n + k) | O(n²) | O(n + k) | 是 | 否 |
| 基数排序 | O(nk) | O(nk) | O(nk) | O(n + k) | 是 | 否 |
| 线性搜索 | O(1) | O(n) | O(n) | O(1) | 不适用 | 是 |
| 二分搜索 | O(1) | O(log n) | O(log n) | O(1) | 不适用 | 是 |
来源:README.md:192-228, README.md:330-352
该仓库将搜索相关代码组织在BinarySearch目录下用于二分搜索问题,以及在主题特定目录下用于其他搜索相关实现。
来源:README.md:403-407
排序和搜索算法在技术面试中频繁出现,通过测试这些算法的直接实现和创造性应用的问题来考察应聘者。
来源:README.md:34-53
理解排序和搜索算法对于以下方面至关重要:
该仓库提供了实现,展示了这些基本算法如何在实际面试问题中应用。
来源:README.md:12-27