1、排序规则
1.1 一句话总结选择排序
从数组中第一个数字开始,数组中每个数字都要和后面所有数字比一次大小,每每次循环遍历当前最小值,放在当前循环范围内的最小位置。当完成第 N - 1
次循环之后,排序完成。N = 数组长度 - 1
。
1.2 排序方法和规则
假设对数组 arr = [1, 4, 7, 3, 5, 8, 9, 2, 10, 6]排序,数组长度为 arr.length,i 为数组下标。
1.假设我们用红色来标记最小值,
2.假设数组中的第 i = 0(索引下标为 0)个元素就是整个数组的最小值,我们暂时先把它标记为红色。
3.为了验证第 i = 0(索引下标为 0)个元素是最小值,他需要和数组中每个元素进行比较。
4.在遍历过程中,如过发现更小值,在遍历完整个数组之前,则暂时先标记新的最小值为红色。
5.继续遍历,重复上一步,直至循环结束,当前红色位置的数字就是最小值。
6.把最小值和当前第一个数字位置调换,因为红色位置的数字更小。‘
7.此时我们完成了一轮循环,整个数组中最小的数字已经找到,我们给它标记为橙色。
8.下面我们开始第二轮循环,找数组中第二小的数字,因为第一小的数字已经找到,所以我们第二轮循环从第 i = 1(索引下标为 1)个数字开始,方法为在除去第一个数字剩下的数字中重复 1-7 步。
9.反复如此,每次循环,可以确定下标在 i 之后的所有元素的最小值,即当前循环的最小值。
10.当完成了 arr.llength -1 次循环遍历之后,选择排序完成。
2、动画演示
网络异常,图片无法展示
|
- 橙色:每轮循环最终的最小值
- 红色:每轮循环过程中的临时最小值,当绿色滚动发现更小值的时候,更新临时最小值
- 蓝色:尚未排序的元素
3、Java 实现
public class 选择排序 { public static void main(String[] args) { int[] arr = {1, 4, 7, 3, 5, 8, 9, 2, 10, 6}; // 排序前 printArr(arr); // 排序 selectSort(arr); // 排序后 printArr(arr); } private static void printArr(int[] arr) { for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } System.out.println(); } public static void selectSort(int[] arr) { // 0~ N-1 // 1~ N-1 // N-2 ~ N-1 for (int i = 0; i < arr.length; i++) { int minValIndex = i; for (int j = i + 1; j < arr.length; j++) { minValIndex = arr[j] < arr[minValIndex] ? j : minValIndex; } if (minValIndex != i) { swap(arr, i, minValIndex); } } } private static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } }