思路:
原始的数组 : 101, 34, 119, 1
第一轮排序 : 1, 34, 119, 101
第二轮排序 : 1, 34, 119, 101
第三轮排序 : 1, 34, 101, 119
思路:
1. 选择排序一共有 数组大小 - 1 轮排序
2. 每1轮排序,又是一个循环, 循环的规则(代码)
2.1先假定当前这个数是最小数
2.2 然后和后面的每个数进行比较,如果发现有比当前数更小的数,就重新确定最小数,并得到下标
2.3 当遍历到数组的最后时,就得到本轮最小数和下标
2.4 交换
package sort;
import java.util.Arrays;
/**
* 思路:
* 1. 选择排序一共有 数组大小 - 1 轮排序
* 2. 每1轮排序,又是一个循环, 循环的规则(代码)
* 2.1先假定当前这个数是最小数
* 2.2 然后和后面的每个数进行比较,如果发现有比当前数更小的数,就重新确定最小数,并得到下标
* 2.3 当遍历到数组的最后时,就得到本轮最小数和下标
* 2.4 交换
* 3. 比如这是第一次循环,则最小值交换到第一个位置的地方(最小),
* 第二轮循环,最小值交换到第二个位置的地方(较小), 以此下去
* 在判断大小值的过程中,因为每轮内循环找到的是当前数组中最小的值,
* 且位置已经交换好,已经有序,不再参与以后的比较过程中
* (1)问:为什么第一个for外循环length - 1 ,第二个for内循环arr.length?
* 答: 数组中有四个元素 比较三轮找出来三个较小值,前三个数据有序,则剩下的一个数据就不用再比较了(外循环)
* 和后面的每个数进行比较,除了与自己比较(内循环)
* (2)问:if(minIndex != i)什么意思
* 答:如果最小值下标和原来的下标一样,就不用交换,
* (3)内循环负责找出该论最小值的下标,外循环负责重复寻找最小值的下标
* */
public class SelectSort{
public static void main(String[] args) {
int arr[] = {3, 9, -1, 10, 20};
selectSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void selectSort(int[] arr) {
int temp = 0;
//即第一个是最小值,不必再接着比较,从下一个值开始即可
for (int i = 0; i < arr.length - 1 ; i++) {//执行数组 - 1次 数组中有四个元素 比较三轮找出来三个最小值,剩下的一个有序
int minIndex = i;//默认为第一个
for(int j = i + 1;j < arr.length ;j++){//这里不用减一,因为和数组中的每一个比较(除了最小值)
if(arr[minIndex] > arr[j]){//如果最小值比其他数值小,记录下其下标即可
minIndex = j;
}
}
//一轮排序中找到值最小的下标,交换即可
if(minIndex != i){//如果下标和原来一样,就不用交换,否则就交换元素的值 交换值
temp = arr[minIndex];
arr[minIndex] = arr[i];
arr[i] = temp;
}
}
}
}