选择排序如同精明的园丁挑选果实:
整个过程就像逐渐构建有序序列的拼图游戏,每次只确保当前拼块的位置正确。
public class SelectionSort {
public static void sort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
// 在未排序区寻找最小值
int minIndex = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
// 将最小值交换到已排序区末尾
if (minIndex != i) {
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
}
public static void main(String[] args) {
int[] data = {64, 25, 12, 22, 11};
sort(data);
System.out.println(Arrays.toString(data)); // [11, 12, 22, 25, 64]
}
}
指标 | 数值 | 说明 |
---|---|---|
时间复杂度 | O(n²) | 双重循环结构,比较次数固定 |
空间复杂度 | O(1) | 原地排序,无需额外空间 |
算法特性:
实际案例:
新手必练:
高手进阶:
// 优化版:同时找最大最小值
public static void dualSelectionSort(int[] arr) {
int left = 0, right = arr.length - 1;
while (left < right) {
int min = left, max = right;
for (int i = left; i <= right; i++) {
if (arr[i] < arr[min]) min = i;
if (arr[i] > arr[max]) max = i;
}
swap(arr, left, min);
if (max == left) max = min; // 处理最大值被交换的情况
swap(arr, right, max);
left++;
right--;
}
}
选择排序教会我们:
当你能在5分钟内教会新人选择排序时,说明真正理解了算法教学的精髓——用最简单的逻辑解释复杂现象。这不仅是排序算法,更是知识传递的艺术。