1. 排序算法基础与复杂度分析
排序算法是计算机科学中最基础也最重要的算法之一。作为程序员,理解不同排序算法的特性和适用场景,能够帮助我们根据具体问题选择最优解决方案。在面试中,排序算法更是必考知识点,尤其关注时间复杂度和空间复杂度的分析。
1.1 算法复杂度基础
算法复杂度分为时间复杂度和空间复杂度,通常用大O表示法来描述。理解复杂度有助于我们评估算法在不同数据规模下的表现:
- 时间复杂度:表示算法运行时间随数据规模增长的变化趋势
- 空间复杂度:表示算法所需额外空间随数据规模增长的变化趋势
常见的时间复杂度从优到劣排列:
- O(1) > O(log n) > O(n) > O(n log n) > O(n²) > O(2ⁿ) > O(n!)
1.2 排序算法分类
排序算法大致可以分为以下几类:
-
简单排序算法:实现简单但效率较低,适合小规模数据
- 选择排序
- 冒泡排序
- 插入排序
-
高效排序算法:适合大规模数据排序
- 快速排序
- 归并排序
- 堆排序
-
线性时间排序算法:在特定条件下可以达到O(n)时间复杂度
- 计数排序
- 桶排序
- 基数排序
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 简单排序算法详解
2.1 选择排序(Selection Sort)
选择排序是最直观的排序算法之一,其核心思想是:每次从未排序部分选择最小(或最大)元素,放到已排序部分的末尾。
2.1.1 Java实现
java复制public class SelectionSort {
public static void sort(int[] arr) {
for (int i = 0; i < arr.length; i++) {
int minIndex = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
swap(arr, i, minIndex);
}
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
2.1.2 复杂度分析
- 时间复杂度:O(n²)
- 比较次数:n-1 + n-2 + ... + 1 = n(n-1)/2
- 交换次数:n-1
- 空间复杂度:O(1)(原地排序)
2.1.3 特点与适用场景
- 优点:实现简单,交换次数少(最多n-1次)
- 缺点:时间复杂度高,不适合大数据量
- 适用场景:数据量小,且交换成本高的情况
2.2 冒泡排序(Bubble Sort)
冒泡排序通过重复地遍历要排序的列表,比较相邻元素并交换它们的位置来实现排序。
2.2.1 Java实现
java复制public class BubbleSort {
public static void sort(int[] arr) {
for (int i = arr.length - 1; i > 0; i--) {
for (int j = 0; j < i; j++) {
if (
