选择排序
选择排序学习
排序基本步骤:
①:找到数组中元素最小的那个元素;
②:将它和数组的第一个元素交换位置(如果第一个元素就是最小元素,那么它和自己交换);
③:在剩下的元素中找到最小的元素,将他与数组第二个元素交换位置;
④:重复 1~3 步,直到将整个数组排序。
排序特点:
①:运行时间与输入无关,有序的数组和一个元素随机排列的数组排序,两个所用的时间一致;
②:数据移动是最少的,对于长度为 N 的数组,选择排序大约需要 N2/2 次比较,N 次交换——交换次数和数组大小是线性关系。
代码实现:
1 public static void main(String[] args) { 2 Integer[] a = {2, 1, 4, 5, 0, -2, -3, 10}; 3 sort(a); 4 System.out.println("数组有序:" + isSorted(a)); 5 show(a); 6 } 7 /* 8 * 对元素进行比较,返回比较结果 9 * a < b 返回 true 10 * a >= b 返回 false 11 */ 12 private static boolean less(Integer a, Integer b) { 13 return a.compareTo(b) < 0; 14 } 15 16 /* 17 * 将元素交换位置 18 */ 19 private static void exch(Integer[] a, int i, int j) { 20 Integer temp = a[i]; 21 a[i] = a[j]; 22 a[j] = temp; 23 } 24 25 /* 26 * 在单行中打印数组,数组元素之间以空格分隔 27 */ 28 private static void show(Integer[] a) { 29 int length = a.length; 30 for (int i = 0; i < length; i++) { 31 if (i == 0) 32 System.out.print(a[i]); 33 System.out.print(" " + a[i]); 34 } 35 System.out.println(); 36 } 37 38 /** 39 * 测试数组元素是否有序 40 * 按从小到大排列:返回true 41 */ 42 private static boolean isSorted(Integer[] a) { 43 int length = a.length; 44 for (int i = 1; i < length; i++) { 45 if (less(a[i], a[i - 1])) 46 return false; 47 } 48 return true; 49 }
1 /* 2 * 选择排序,对数组进行升序排序 3 */ 4 public static void sort(Integer[] a) { 5 /*数组的长度*/ 6 int length = a.length; 7 for (int i = 0; i < length; i++) { 8 /*最小元素索引*/ 9 int min = i; 10 for (int j = i + 1; j < length; j++) { 11 if (less(a[j], a[min])) 12 min = j; 13 } 14 exch(a, i, min); 15 } 16 }

浙公网安备 33010602011771号