#Raptor程序设计(算法篇)
- 冒泡排序 冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访要排序的数列,依次比较相邻元素,如果它们的顺序错误就交换它们的位置。这个过程会从数列的第一个元素开始向最后进行,这样每次走访都会将未排序部分的最大或最小元素“冒泡”到它正确的位置上。此过程会持续进行直到没有需要再交换的元素,即所有元素都已经按照要求排好序。
冒泡排序的基本步骤如下:
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
冒泡排序的时间复杂度在最坏和平均情况下为 O(n²),其中 n 是列表中的元素数量。因此,对于大数据集来说,冒泡排序不是最优的选择。然而,它的实现简单,并且在几乎已经排序好的列表中表现较好,此时其最佳情况时间复杂度可以达到 O(n)。此外,冒泡排序是一个稳定的排序算法,意味着相等元素的相对顺序在排序后不会改变。
2. 选择排序
选择排序(Selection Sort)是一种简单但不太高效的排序算法。它的基本思想是:从未排序的部分找到最小(或最大,视排序顺序而定)的元素,将其放到已排序序列的末尾。这个过程会不断地重复,直到所有元素都已排序。
选择排序的具体步骤如下:
- 初始状态:将整个数组分为两部分,左边为已排序部分(最初为空),右边为未排序部分(最初为整个数组)。
- 寻找最小值:在未排序部分中找到最小元素。
- 交换位置:将找到的最小元素与未排序部分的第一个元素交换位置(如果它不是第一个元素的话)。
- 更新边界:将已排序部分的边界右移一位,即增加已排序部分,减少未排序部分。
- 重复步骤2-4:对剩余的未排序部分重复上述操作,直到所有元素都被处理完毕。
选择排序的主要特点有:
- 时间复杂度:选择排序的时间复杂度为 O(n²),其中 n 是列表中的元素数量。这是因为无论数据是否有序,都需要进行 n*(n-1)/2 次比较和最多 n-1 次交换。
- 空间复杂度:选择排序的空间复杂度为 O(1),因为它只需要一个额外的临时变量用于交换元素。
- 稳定性:选择排序不是一个稳定的排序算法,因为在排序过程中可能会改变相同元素之间的相对顺序。
- 适应性:选择排序不是自适应的,即使输入的数据几乎已经排序好,它仍然需要进行大约一半的比较操作。
- 顺序查找 顺序查找(Sequential Search),也被称为线性查找(Linear Search),是一种简单直接的查找算法。它适用于未排序或已排序的数据列表。顺序查找的基本思想是从列表的第一个元素开始,逐个检查每个元素,直到找到目标值或者遍历完所有元素为止。
顺序查找的具体步骤如下:
- 初始化:从列表的第一个元素开始。
- 比较:将当前元素与要查找的目标值进行比较。
- 匹配成功:如果当前元素等于目标值,则返回该元素的位置(索引)。
- 继续查找:如果当前元素不等于目标值,则移动到下一个元素并重复步骤2和3。
- 结束条件:如果到达了列表的末尾且没有找到目标值,则返回一个表示找不到的标志(如返回 -1 或者
null
)。
顺序查找的特点包括:
- 时间复杂度:最坏情况下为 O(n),其中 n 是列表中的元素数量。这是因为可能需要遍历整个列表才能确定目标值是否存在。
- 空间复杂度:O(1),因为只需要少量额外的空间来存储临时变量。
- 适用场景:顺序查找适用于小型数据集或未排序的数据集。对于大型数据集或性能要求较高的应用,更高效的查找算法(如二分查找)可能是更好的选择。
- 不需要有序列表:顺序查找不要求列表是有序的,因此它可以用于任何类型的列表,无论是否经过排序。
顺序查找是一个非常基础的算法,虽然它的效率不是最高的,但它实现简单,易于理解,适合在不知道数据分布情况时使用。对于已经排序的数据列表,可以考虑使用更高效的查找方法,例如二分查找。
4. 二分查找
二分查找(Binary Search),也称为折半查找,是一种高效的查找算法,适用于已经排序的数据列表。其基本思想是每次将查找范围缩小一半,通过比较中间元素与目标值来决定是在前半部分还是后半部分继续查找,直到找到目标值或者确定目标值不在列表中。
二分查找的具体步骤如下:
- 初始化:设定两个边界指针,分别指向列表的起始位置(low)和结束位置(high)。
- 检查终止条件:如果
low
超过high
,则表示查找区间为空,目标值不存在于列表中,返回一个找不到的标志(如返回 -1 或者null
)。 - 计算中间点:计算当前查找区间的中间位置
mid
(通常是(low + high) // 2
,但为了防止溢出,也可以使用low + (high - low) // 2
)。 - 比较中间元素:
- 如果中间元素等于目标值,则返回该元素的位置(索引)。
- 如果中间元素大于目标值,则在左半部分继续查找(即设置
high = mid - 1
)。 - 如果中间元素小于目标值,则在右半部分继续查找(即设置
low = mid + 1
)。
- 重复步骤2-4:根据新的查找区间,重复上述过程,直到找到目标值或满足终止条件。
二分查找的特点包括:
- 时间复杂度:O(log n),其中 n 是列表中的元素数量。这是因为每次迭代都会将查找范围减半。
- 空间复杂度:O(1),因为只需要少量额外的空间来存储几个变量。
- 适用场景:二分查找要求数据必须是有序的,并且最好是静态或不频繁更新的数据集。对于动态变化频繁的数据,维护排序状态的成本可能会超过二分查找带来的效率提升。
- 稳定性:二分查找本身并不保证相等元素的相对顺序不变,因此它不是一个稳定的查找算法,但这通常不是问题,因为我们主要关心的是找到目标值而不是保持元素之间的相对顺序。
由于二分查找的高度效率,它在许多应用中都非常有用,尤其是在处理大量数据时。然而,它的前提是数据必须是有序的,这是使用二分查找的一个重要限制条件。
点击这里下载文件
提取码 RAPTOR