选择排序(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