首先理解定义(百度百科)
**选择排序(Selection sort)**是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。
举个简单的例子:一组数据 2,1,9,7,3
使用选择排序:第一次排序的结果为 1,2,9,7,3
第二次排序的结果为 1,2,9,7,3
第三次排序的结果为 1,2,3,7,9
第四次排序的结果为 1,2,3,7,9
我们可以分析下过程,根据它的定义
第一次是找到这个数组的最小值放到第一位,同时把第一位的值交换到和它互换元素的位置,所以第一次排序的结果为1,2,9,7,3
第二次其实是在2,9,7,3中找最小值,因为2为其中最小值了,所以第二次排序结果为1,2,9,7,3
第三次其实是在9,7,3中找最小值,发现3最小于是将3与9的位置互换,第三次排序结果为1,2,3,7,9
第四次在7,9中找最小值,所以排序结果为1,2,3,7,9
根据分析我们可以得出需要定义两个变量 最小值min以及最小值的索引minIndex,也是需要双重循环去做,外面的一层循环主要是对元素进行互换,里面的循环主要是找到最小值:
根据代码我们可以更清晰的分析
public static void main(String[] args) {
//随机数组
int arr[] = {2, 1, 9, 7, 3};
// 12973
for(int i=0;i<arr.length-1;i++){
//假设最小值的索引为0
int minIndex=i;
//假设最小值为第一个元素
int min=arr[i];
//第一次循环i=0;所以我们直接拿第二个元素和它比较
//也就是j从1开始
for(int j=i+1;j<arr.length;j++){
//如果后面一个元素比前面元素的值小
//则将这个值赋值为最小元素,并记录它的索引位置
if(min>arr[j]){
//重置最小值
min=arr[j];
//重置最小值索引
minIndex=j;
}
}
//内层循环找出最小值及索引 ,因为外层循环从i=0开始,如果不等于初始值,则元素互换
if(minIndex!=i){
//进行交换 将最小值放在i的位置
arr[minIndex]=arr[i];
//每次循环的最小值在i的位置
arr[i]=min;
}
System.out.println("第"+(i+1)+"次排序为"+Arrays.toString(arr));
}
System.out.println("最终排序为"+Arrays.toString(arr));
}
运行结果如下
第1次排序为[1, 2, 9, 7, 3]
第2次排序为[1, 2, 9, 7, 3]
第3次排序为[1, 2, 3, 7, 9]
第4次排序为[1, 2, 3, 7, 9]
最终排序为[1, 2, 3, 7, 9]