算法思想
(不断地选择剩余元素之中的最小者)
- 找到数组中最小的那个元素
- 将它与数组的第一个元素交换位置(如果第一个元素就是最小的元素,那么它就和自己交换)
- 在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置
- 如此往复,直到将整个数组排序
Java实现
代码
public class Selection { // 将a[]按升序排列 public static void sort(Comparable[] a) { int N = a.length;// 数组长度 for (int i = 0; i < N; i++) { // 将a[i]和a[i+1..N]中最小元素交换 int min = i;// 最小元素的索引 for (int j = i+1; j < N; j++) if (less(a[j], a[min])) min = j; exch(a, i, min); } } private static boolean less(Comparable v, Comparable w) { return v.compareTo(w) < 0; } private static void exch(Comparable[] a, int i, int j) { Comparable t = a[i]; a[i] = a[j]; a[j] = t; } // 在单行中打印数组 public static void show(Comparable[] a) { for (int i = 0; i < a.length; i++) System.out.print(a[i] + " "); System.out.println(); } // 测试数组元素是否有序 public static boolean isSorted(Comparable[] a) { for (int i = 1; i < a.length; i++) if (less(a[i], a[i-1])) return false; return true; } }
测试用例
@Test public static void testSelection() { String[] test = {"S", "O", "R", "T", "E", "X", "A", "M", "P", "L", "E"}; Selection.sort(test); assert Selection.isSorted(test); Selection.show(test); }
结果
A E E L M O P R S T X