一、排序算法全景图
算法分类与核心指标:
排序类型 | 典型算法 | 时间复杂度(平均) | 稳定性 | 适用场景 |
---|---|---|---|---|
比较排序 | 快速排序 | O(n log n) | 不稳定 | 通用排序 |
非比较排序 | 计数排序 | O(n + k) | 稳定 | 小范围整数 |
分治排序 | 归并排序 | O(n log n) | 稳定 | 大数据外部排序 |
二、基础排序算法详解
1. 冒泡排序(Bubble Sort)
核心思想:相邻元素两两比较,将最大元素逐步"冒泡"到末尾
public static void bubbleSort(int[] arr) {
int n = arr.length;
for (int i = 0; i < n-1; i++) {
boolean swapped = false;
for (int j = 0; j < n-i-1; j++) {
if (arr[j] > arr[j+1]) {
// 交换元素
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
swapped = true;
}
}
if (!swapped) break; // 优化:提前终止
}
}
优化点:添加swap标志位减少无效循环
2. 选择排序(Selection Sort)
核心思想:每次从未排序部分选择最小元素放到已排序末尾
public static void selectionSort(int[] arr) {
int n = arr.length;
for (int i = 0; i < n-1; i++) {
int minIndex = i;
for (int j = i+1; j < n; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
// 交换找到的最小元素
int temp = arr[minIndex];
arr[minIndex] = arr[i];
arr[i] = temp;
}
}
特点:交换次数少(O(n)次),适合写操作昂贵的场景
3. 插入排序(Insertion Sort)
核心思想:将未排序元素插入到已排序序列的合适位置
public static void insertionSort(int[] arr) {