选择排序
选择排序思想:
首先遍历数组,每轮遍历将数组内一个最小的一个值放到数组的前面,之后再从剩下的数组内选择一个最小的数放到其次的位置,直到最后两个数比较完。
具体实现思路
-
假设数组第一个为最小值,用for循环去遍历数组,如果有比最小值小的数,将其数组下标记下保存在一个变量中。
(为什么是下标?)
因为每一轮遍历之后需要将最小值放到数组前面,方便循环完一遍之后将遍历出的最小值与所放目标位置交换,而不需要在每次找到比最小值小的数时两个交换,用下标只需在遍历完成之后交换一次。 -
关于两个for循环的取值与范围:
①外循环:外层控制循环的次数,循环次数从0开始,到数组长度-1结束。在外循环内定义一个存最小值的变量(minNumber)存最小值的下标,将i的值赋给它用于假设要遍历数组的第一个值是最小值。
②内循环:内层循环j=i+1相当于是minNumber后一个数的下标,因为j会随for循环增加,从而往后遍历寻找最小值,当遍历到最后一个时结束,因此范围为:j<数组长度 -
拿出每轮最小值下标
通过在内循环使用if判断,我们j遍历的数组值是否比我们假设的要小,如果是,将这个值的下标给minNumber,此时minNumber的值就变成比之前更小的值的下标。如此往复,直到内循环结束,就能取到最小的那个值的下标。 -
两个数组交换位置
通过上一步之后就可以得到这一轮最小的值的下标,在外循环内将位置交换。 -
外循环i++
外循环++就表示要开始新一轮的查找,而通过上一步操作,已经将上一轮的最小值放到前面。
public class SelectionSort2 {
public static void main(String[] args) {
int[] arr ={13,45,74,12,24};
for (int i = 0;i< arr.length;i++){
int minNumber=i;
for (int j = i+1;j< arr.length;j++){
if (arr[minNumber]>arr[j]){
minNumber=j;
}
}
int temp = arr[i];
arr[i] = arr[minNumber];
arr[minNumber] = temp;
}
for (int num:arr) {
System.out.println(num);
}
}
}