parent
0bec52d7cc
commit
9a74d9a9d1
@ -1,18 +1,16 @@
|
||||
# 小结
|
||||
|
||||
- 线性查找是一种最基础的查找方法,通过遍历数据结构 + 判断条件实现查找。
|
||||
- 二分查找利用数据的有序性,通过循环不断缩小一半搜索区间来实现查找,其要求输入数据是有序的,并且仅适用于数组或基于数组实现的数据结构。
|
||||
- 哈希查找借助哈希表来实现常数阶时间复杂度的查找操作,体现以空间换时间的算法思想。
|
||||
- 下表总结对比了查找算法的各种特性和时间复杂度。
|
||||
- 线性查找通过遍历数据结构并进行条件判断来完成查找任务。
|
||||
- 二分查找依赖于数据的有序性,通过循环逐步缩减一半搜索区间来实现查找。它要求输入数据有序,且仅适用于数组或基于数组实现的数据结构。
|
||||
- 哈希查找利用哈希表实现常数阶时间复杂度的查找操作,体现了空间换时间的算法思维。
|
||||
- 下表概括并对比了三种查找算法的特性和时间复杂度。
|
||||
|
||||
<div class="center-table" markdown>
|
||||
|
||||
| | 线性查找 | 二分查找 | 哈希查找 |
|
||||
| ------------------------------------- | ------------------------ | ----------------------------- | ------------------------ |
|
||||
| 适用数据结构 | 数组、链表 | 数组 | 数组、链表 |
|
||||
| 输入数据要求 | 无 | 有序 | 无 |
|
||||
| 平均时间复杂度</br>查找 / 插入 / 删除 | $O(n)$ / $O(1)$ / $O(n)$ | $O(\log n)$ / $O(n)$ / $O(n)$ | $O(1)$ / $O(1)$ / $O(1)$ |
|
||||
| 最差时间复杂度</br>查找 / 插入 / 删除 | $O(n)$ / $O(1)$ / $O(n)$ | $O(\log n)$ / $O(n)$ / $O(n)$ | $O(n)$ / $O(n)$ / $O(n)$ |
|
||||
| 空间复杂度 | $O(1)$ | $O(1)$ | $O(n)$ |
|
||||
| 适用数据结构 | 数组、链表 | 有序数组 | 数组、链表 |
|
||||
| 时间复杂度</br>(查找,插入,删除) | $O(n)$ , $O(1)$ , $O(n)$ | $O(\log n)$ , $O(n)$ , $O(n)$ | $O(1)$ , $O(1)$ , $O(1)$ |
|
||||
| 空间复杂度 | $O(1)$ | $O(1)$ | $O(n)$ |
|
||||
|
||||
</div>
|
||||
|
@ -1,13 +1,14 @@
|
||||
# 小结
|
||||
|
||||
- 冒泡排序通过交换相邻元素来实现排序。通过增加标志位实现提前返回,我们可将冒泡排序的最佳时间复杂度优化至 $O(N)$ 。
|
||||
- 插入排序每轮将待排序区间内元素插入至已排序区间的正确位置,从而实现排序。插入排序的时间复杂度虽为 $O(N^2)$ ,但因为总体操作少而很受欢迎,一般用于小数据量的排序工作。
|
||||
- 快速排序基于哨兵划分操作实现排序。在哨兵划分中,有可能每次都选取到最差的基准数,从而导致时间复杂度劣化至 $O(N^2)$ ,通过引入中位数基准数或随机基准数可大大降低劣化概率。尾递归方法可以有效减小递归深度,将空间复杂度优化至 $O(\log N)$ 。
|
||||
- 归并排序包含划分和合并两个阶段,是分而治之的标准体现。对于归并排序,排序数组需要借助辅助数组,空间复杂度为 $O(N)$ ;而排序链表的空间复杂度可以被优化至 $O(1)$ 。
|
||||
- 桶排序分为三步,数据分桶、桶内排序、合并结果,体现分治策略,适用于体量很大的数据。桶排序的难点在于数据的平均划分。
|
||||
- 计数排序是桶排序的一种特例,通过统计数据出现次数来实现排序;适用于数据量大但数据范围不大的情况,并且要求数据可以被转化为正整数。
|
||||
- 基数排序通过依次排序各位来实现数据排序,要求数据可以被表示为固定位数的数字。
|
||||
- 冒泡排序通过交换相邻元素来实现排序。通过添加一个标志位来实现提前返回,我们可以将冒泡排序的最佳时间复杂度优化到 $O(n)$ 。
|
||||
- 插入排序每轮将待排序区间内的元素插入到已排序区间的正确位置,从而完成排序。虽然插入排序的时间复杂度为 $O(n^2)$ ,但由于单元操作相对较少,它在小数据量的排序任务中非常受欢迎。
|
||||
- 快速排序基于哨兵划分操作实现排序。在哨兵划分中,有可能每次都选取到最差的基准数,导致时间复杂度劣化至 $O(n^2)$ 。引入中位数基准数或随机基准数可以降低这种劣化的概率。尾递归方法可以有效地减少递归深度,将空间复杂度优化到 $O(\log n)$ 。
|
||||
- 归并排序包括划分和合并两个阶段,典型地体现了分治策略。在归并排序中,排序数组需要创建辅助数组,空间复杂度为 $O(n)$ ;然而排序链表的空间复杂度可以优化至 $O(1)$ 。
|
||||
- 桶排序包含三个步骤:数据分桶、桶内排序和合并结果。它同样体现了分治策略,适用于数据体量很大的情况。桶排序的关键在于对数据进行平均分配。
|
||||
- 计数排序是桶排序的一个特例,它通过统计数据出现的次数来实现排序。计数排序适用于数据量大但数据范围有限的情况,并且要求数据能够转换为正整数。
|
||||
- 基数排序通过逐位排序来实现数据排序,要求数据能够表示为固定位数的数字。
|
||||
|
||||
![排序算法对比](summary.assets/sorting_algorithms_comparison.png)
|
||||
|
||||
- 总体来看,我们追求运行快、稳定、原地、正向自适应性的排序。显然,如同其他数据结构与算法一样,同时满足这些条件的排序算法并不存在,我们需要根据问题特点来选择排序算法。
|
||||
- 总的来说,我们希望找到一种排序算法,具有高效率、稳定、原地以及正向自适应性等优点。然而,正如其他数据结构和算法一样,没有一种排序算法能够同时满足所有这些条件。在实际应用中,我们需要根据数据的特性来选择合适的排序算法。
|
||||
|
Loading…
Reference in new issue