基本原理
基本思想是:首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置;接着,再从剩余未排序的元素中继续寻找最小(or最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
实例演示
一级目录
第一轮排序:注意for循环i=1,因为第一轮的时候假设最小的数就是第一个,所以比较从第二个数开始,也就是i=1
package com.company.sort;
import java.util.Arrays;
public class SelectorSort {
//选择排序
public static void main(String[] args) {
int[] list={101,34,109,1};
Selector(list);
}
//第一轮排序
public static void Selector(int[] list){
//在第一轮排序时,假设最小的就是第一个数
int minIndex=0;
int min=list[0];
//经过for循环之后得到的是最小值的索引minIndex和最小值min
for(int i=0+1;i<list.length;i++){
if(list[i]<min){
//将最小数的信息保存在min,索引为minIndex
min=list[i];
minIndex=i;
}
}
//当确定的最小值索引与假设的索引不一致时,将两者交换
if(minIndex!=0){
list[minIndex]=list[0];
list[0]=min;
}
System.out.println(Arrays.toString(list));
}
}
结果:
三轮排序:该序列里共有四个数,所以要进行四次排序
package com.company.sort;
import java.util.Arrays;
public class SelectorSort {
//选择排序
public static void main(String[] args) {
int[] list={101,34,109,1};
Selector(list);
}
public static void Selector(int[] list){
//在第一轮排序时,假设最小的就是第一个数
int minIndex=0;
int min=list[0];
//经过for循环之后得到的是最小值的索引minIndex和最小值min
for(int i=0+1;i<list.length;i++){
if(list[i]<min){
//将最小数的信息保存在min,索引为minIndex
min=list[i];
minIndex=i;
}
}
//当确定的最小值索引与假设的索引不一致时,将两者交换
if(minIndex!=0){
list[minIndex]=list[0];
list[0]=min;
}
System.out.println(Arrays.toString(list));
//第二轮排序
minIndex=1;
min=list[1];
//经过for循环之后得到的是最小值的索引minIndex和最小值min
for(int i=1+1;i<list.length;i++){
if(list[i]<min){
//将最小数的信息保存在min,索引为minIndex
min=list[i];
minIndex=i;
}
}
//当确定的最小值索引与假设的索引不一致时,将两者交换
if(minIndex!=1){
list[minIndex]=list[1];
list[1]=min;
}
System.out.println(Arrays.toString(list));
//第三轮排序
minIndex=2;
min=list[2];
//经过for循环之后得到的是最小值的索引minIndex和最小值min
for(int i=2+1;i<list.length;i++){
if(list[i]<min){
//将最小数的信息保存在min,索引为minIndex
min=list[i];
minIndex=i;
}
}
//当确定的最小值索引与假设的索引不一致时,将两者交换
if(minIndex!=2){
list[minIndex]=list[2];
list[2]=min;
}
System.out.println(Arrays.toString(list));
}
}
结果:
从上述代码可以看出可以用双层for循环完成选择排序:
for(int j=0;j<list.length-1;j++){
//第j轮就假设最小的是list[i]
int minIndex=j;
int min=list[j];
//经过for循环之后得到的是最小值的索引minIndex和最小值min
for(int i=j+1;i<list.length;i++){
if(list[i]<min){
//将最小数的信息保存在min,索引为minIndex
min=list[i];
minIndex=i;
}
}
//当确定的最小值索引与假设的索引不一致时,将两者交换
if(minIndex!=j){
list[minIndex]=list[j];
list[j]=min;
}
System.out.println(Arrays.toString(list));
}
结果: