选择排序
一种内部排序,选出某个元素,按照规则交换
基本思想:
重复(元素个数-1)次
把第一个没有排序过的元素设置为最小值
遍历每个没有排序过的元素
如果元素 < 现在的最小值
将此元素设置成为新的最小值
将最小值和第一个没有排序过的位置交换
第一次:遍历数组,找到最小值后,与arr[0]交换
第二次:从arr[1] - arr[n-1]中选择最小的,与arr[1]交换。
.
.
.
.
第i次:从arr[i-1]-arr[n-1]中选择最小值,与arr[i-1]交换
实例:原始的数组:101, 34, 119, 1
第一轮排序:1,34,119,101
第二轮排序:1,34,119,101
第三轮排序:1,34,101,119
说明:
1)选择排序一个有数组大小-1轮排序
2)每一轮排序,又是一个有规则的循环
2.1)先假定当前这个数是最小的,
2.2)然后和后面每个数进行比较,如果发现有比它更小的,就重新确定最小数,并得到下标
2.3)当遍历到数组的最后时,就得到本轮最小数和小标
2.4)交换
代码:
1 // 选择排序 时间复杂度为O(n^2),,嵌套for循环 2 public static void selectSort(int[] arr) { 3 4 // 使用逐步推导的方式 5 // 第一轮 6 // 原始的数组:101, 34, 119, 1 7 // 第一轮排序:1,34,119,101 8 for (int i = 0; i < arr.length - 1; i++) { 9 int minIndex = i; 10 int min = arr[i]; 11 for (int j = i + 1; j < arr.length; j++) { 12 if (min > arr[j]) { // 说明假定的最小值不是最小 13 min = arr[j]; // 重置min 14 minIndex = j; // 重置minIndex 15 } 16 } 17 // 将最小值,放在arr[0],即交换 18 if (minIndex != i) { // 优化部分 19 arr[minIndex] = arr[i]; 20 arr[i] = min; 21 } 22 System.out.println("第"+(i + 1)+"轮后"); 23 System.out.println(Arrays.toString(arr)); 24 } 25 26 27 28 // // 第二轮排序:1,34,119,101 29 // minIndex = 1; 30 // min = arr[1]; 31 // for(int j = 1 + 1; j < arr.length; j++) { 32 // if(min > arr[j]) { // 说明假定的最小值不是最小 33 // min = arr[j]; // 重置min 34 // minIndex = j; // 重置minIndex 35 // } 36 // } 37 // // 将最小值,放在arr[0],即交换 38 // if(minIndex != 1) { 39 // arr[minIndex] = arr[1]; 40 // arr[1] = min; 41 // } 42 // 43 // System.out.println("第2轮后"); 44 // System.out.println(Arrays.toString(arr)); 45 // 46 // 47 // 48 // // 第三轮排序:1,34,101,119 49 // minIndex = 2; 50 // min = arr[2]; 51 // for(int j = 2 + 1; j < arr.length; j++) { 52 // if(min > arr[j]) { // 说明假定的最小值不是最小 53 // min = arr[j]; // 重置min 54 // minIndex = j; // 重置minIndex 55 // } 56 // } 57 // // 将最小值,放在arr[0],即交换 58 // if(minIndex != 2) { 59 // arr[minIndex] = arr[2]; 60 // arr[2] = min; 61 // } 62 // System.out.println("第3轮后"); 63 // System.out.println(Arrays.toString(arr)); 64 // 65 66 }
posted on 2021-02-05 13:24 Love&Share 阅读(80) 评论(0) 编辑 收藏 举报