Java实现选择排序算法
1. 选择排序原理图解
选择排序是一种简单直观的比较排序算法。它的基本思想是:每次从未排序的部分中找到最小(或最大)的元素,将其放到已排序部分的末尾。具体步骤如下:
1. 初始状态:数组 `[64, 25, 12, 22, 11]`。
2. 第一次遍历:从未排序部分 `[64, 25, 12, 22, 11]` 中找到最小值 `11`,与第一个元素 `64` 交换,得到 `[11, 25, 12, 22, 64]`。
3. 第二次遍历:从未排序部分 `[25, 12, 22, 64]` 中找到最小值 `12`,与第二个元素 `25` 交换,得到 `[11, 12, 25, 22, 64]`。
4. 第三次遍历:从未排序部分 `[25, 22, 64]` 中找到最小值 `22`,与第三个元素 `25` 交换,得到 `[11, 12, 22, 25, 64]`。
5. 第四次遍历:从未排序部分 `[25, 64]` 中找到最小值 `25`,与第四个元素 `25` 交换(无需操作),得到 `[11, 12, 22, 25, 64]`。
6. 最终结果:数组已完全排序为 `[11, 12, 22, 25, 64]`。
2. Java代码实现及注释
```java
public class SelectionSort {
public static void main(String[] args) {
int[] array = {64, 25, 12, 22, 11};
selectionSort(array);
System.out.println("排序后的数组:");
for (int num : array) {
System.out.print(num + " ");
}
}
// 选择排序方法
public static void selectionSort(int[] array) {
int n = array.length;
// 遍历数组的每个位置
for (int i = 0; i < n - 1; i++) {
// 假设当前元素是最小值
int minIndex = i;
// 在未排序部分中寻找最小值
for (int j = i + 1; j < n; j++) {
if (array[j] < array[minIndex]) {
minIndex = j; // 更新最小值的索引
}
}
// 如果找到更小的值,交换位置
if (minIndex != i) {
int temp = array[i];
array[i] = array[minIndex];
array[minIndex] = temp;
}
}
}
}
```
3. 代码说明
1. 选择排序的核心思想:
- 每次从未排序部分中找到最小值,并将其放到已排序部分的末尾。
- 通过两层循环实现:外层循环控制已排序部分的边界,内层循环在未排序部分中寻找最小值。
2. 时间复杂度:
- **最坏情况**:`O(n²)`(每次都需要遍历整个未排序部分)。
- **最好情况**:`O(n²)`(即使数组已经有序,仍需完成所有比较)。
- **平均情况**:`O(n²)`。
3. 空间复杂度:
- `O(1)`,因为只需要一个额外的变量来交换元素。
4. 稳定性:
- 选择排序是**不稳定的**,因为交换操作可能改变相同值元素的相对顺序。
4. 应用场景
1. 数据量较小的场景:
- 选择排序简单易实现,适合对小规模数据进行排序。
2. 内存限制的场景:
- 由于空间复杂度为 `O(1)`,选择排序在内存有限的情况下表现良好。
3. 教学和演示:
- 选择排序逻辑简单,常用于教学和算法演示。
5. 总结
选择排序是一种基础的排序算法,虽然时间复杂度较高,但在某些特定场景下仍然具有应用价值。它的特点是实现简单,但效率较低,因此在实际应用中通常被更高效的排序算法(如快速排序或归并排序)所取代。