选择排序(Selection Sort)是一种简单直观的排序算法。它的工作原理是首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
在Java中,选择排序可以通过嵌套循环来实现。外层循环控制排序的轮数,内层循环负责在每一轮中找到最小(或最大)的元素,并将其与当前位置的元素交换。
下面是Java中选择排序的一个实现示例,并附有详细的注释:
public class SelectionSort {
public static void main(String[] args) {
int[] arr = {64, 25, 12, 22, 11};
selectionSort(arr);
System.out.println("Sorted array: ");
printArray(arr);
}
// 选择排序算法
static void selectionSort(int arr[]) {
int n = arr.length;
// 外层循环:控制排序的轮数
for (int i = 0; i < n-1; i++) {
// 假设当前位置i就是最小的数的位置
int min_idx = i;
// 内层循环:在未排序的数组中找到最小数的索引
for (int j = i+1; j < n; j++) {
if (arr[j] < arr[min_idx]) {
// 更新最小数的索引
min_idx = j;
}
}
// 将找到的最小数交换到它应该在的位置
// 如果min_idx已经等于i,说明i位置的数已经是最小的了,无需交换
if (min_idx != i) {
int temp = arr[i];
arr[i] = arr[min_idx];
arr[min_idx] = temp;
}
}
}
// 辅助方法,用于打印数组
static void printArray(int arr[]) {
for (int i=0; i < arr.length; i++)
System.out.print(arr[i] + " ");
System.out.println();
}
}代码解析:
初始化:设置两个循环,外层循环变量
i从0开始,到n-2结束(因为排序到最后只剩下一个元素时,它已经是排序好的了,无需再比较)。内层循环变量j从i+1开始,到n-1结束,用于在未排序的数组部分查找最小元素的索引。查找最小元素:内层循环遍历从
i+1到n-1的所有元素,如果发现有更小的元素,则更新最小元素的索引min_idx。交换元素:当内层循环结束后,
min_idx就指向了当前轮次中最小元素的索引。如果min_idx不等于i,则说明找到了一个比当前i位置更小的元素,需要将其与i位置的元素交换。如果min_idx等于i,则说明i位置的元素已经是最小的了,无需交换。重复:重复上述过程,直到整个数组排序完成。
打印结果:使用辅助方法
printArray打印排序后的数组。
选择排序的时间复杂度是固定的,为,其中
是数组的长度。它不受输入数据的影响,即使输入数组已经是排序好的,选择排序的时间复杂度仍然是
。这使得它在处理大数据集时效率较低,但在一些特定场景下(如数据交换开销非常大时),由于其稳定的性能表现,仍然有一定的应用价值。

aa