选择排序

一种内部排序,选出某个元素,按照规则交换

基本思想:
第一次:遍历数组,找到最小值后,与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     }
原文地址:https://www.cnblogs.com/YXBLOGXYY/p/14377203.html