定义
第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。
例如有个数组的长度为10
第一次:从下标0-9中找到最小(大)的数,将这个数的值和下标为0的值交换
第二次:因为下标为0的值已经是最小(大)的了,所以从下标1-9中找到最小(大)的数,将这个数的值和下标为1的值交换
第三次:因为下标为1的值已经是第二小(大)的了,所以从下标2-9中找到最小(大)的数,将这个数的值和下标为2的值交换......
以此类推
代码示例
public class CodeSelectSort {
/**
* 从小到大排序
* @param arr
*/
public static void selectSort(int[] arr) {
if (arr == null || arr.length < 2) {
// 考虑边界情况,数组为空或者长度小于2,则不用排序
return;
}
int n = arr.length;
for (int i = 0; i < n; i++) {
// 最小值所在下标
int currentMinIndex = i;
for (int j = i + 1; j < n; j++) {
// 查找最小值所在下标
currentMinIndex = arr[j] < arr[currentMinIndex] ? j : currentMinIndex;
}
int temp = arr[i];
arr[i] = arr[currentMinIndex];
arr[currentMinIndex] = temp;
}
}
public static void printArr(int[] arr) {
for (int j : arr) {
System.out.print(j + " ");
}
System.out.println();
}
public static void main(String[] args) {
int[] arr = {5, 1, 6, 11, 10, 9, 45, 1, 6, 7, 9, 12};
printArr(arr);
selectSort(arr);
printArr(arr);
}
}
输出结果
5 1 6 11 10 9 45 1 6 7 9 12
1 1 5 6 6 7 9 9 10 11 12 45