简单选择排序思想:首先,找到数组中最小的元素,其次,将它和数组第一个元素交换位置;再次,在剩下的元素中找到最小的元素,将它与数组中的第二个元素交换。如此亡故,直到将整个数组排序。
这种方法叫做选择排序,因为它在不断地选择剩余元素之中的最小者。
先说看每步的状态变化,后边介绍细节,现有无序数组[6 2 4 1 5 9]
第一趟找到最小数1,放到最前边(与首位数字交换)
交换前:| 6 | 2 | 4 | 1 | 5 | 9 |
交换后:| 1 | 2 | 4 | 6 | 5 | 9 |
第二趟找到余下数字[2 4 6 5 9]里的最小数2,与当前数组的首位数字进行交换,实际没有交换,本来就在首位
交换前:| 1 | 2 | 4 | 6 | 5 | 9 |
交换后:| 1 | 2 | 4 | 6 | 5 | 9 |
第三趟继续找到剩余[4 6 5 9]数字里的最小数4,实际没有交换,4待首位置无须交换
第四趟从剩余的[6 5 9]里找到最小数5,与首位数字6交换位置
交换前:| 1 | 2 | 4 | 6 | 5 | 9 |
交换后:| 1 | 2 | 4 | 5 | 6 | 9 |
第五趟从剩余的[6 9]里找到最小数6,发现它待在正确的位置,没有交换
排序完毕输出正确结果[1 2 4 5 6 9]
第一趟找到最小数1的细节
当前数组是| 6 | 2 | 4 | 1 | 5 | 9 |
先把6取出来,让它扮演最小数
当前最小数6与其它数一一进行比较,发现更小数就交换角色
当前最小数6与2比较,发现更小数,交换角色,此时最小数是2,接下来2与剩余数字比较
当前最小数2与4比较,不动
当前最小数2与1比较,发现更小数,交换角色,此时最小数是1,接下来1与剩余数字比较
当前最小数1与5比较,不动
当前最小数1与9比较,不动,到达末尾
当前最小数1与当前首位数字进行位置交换,如下所示
交换前:| 6 | 2 | 4 | 1 | 5 | 9 |
交换后:| 1 | 2 | 4 | 6 | 5 | 9 |
完成一趟排序,其余步骤类似
选择排序有两个明显的特点:
1.运行时间跟输入无关。
为了找出最小元素而扫描一遍数组并不能为下一次扫描提供任何信息。
2.数据移动是最少的。
每次交换都会改变两个数组元素的值。
代码实现(仅供参考):
public class SelectionSort { public int[] selectSort(int[] A, int n) { for (int i = 0; i < n; i++) { int minIndex = i;//最小元素的索引 int min = A[i];//最小元素 for (int j = i; j < n; j++) { if (A[j] < min) { min = A[j]; minIndex = j; } } if (minIndex != i) { int temp = A[i]; A[i] = A[minIndex]; A[minIndex] = temp; } } return A; } public static void main(String args[]) { int A[] = { 2, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 }; int n = A.length; SelectionSort selectionSort = new SelectionSort(); double start = System.currentTimeMillis(); int B[] = selectionSort.selectSort(A, n); for (int i = 0; i < n; i++) System.out.print(B[i] + ","); double end = System.currentTimeMillis(); System.out.println("\n程序运行时间:" + (end - start) + "毫秒"); } }
程序运行时间:2.0毫秒