选择排序:是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
原理:首先用第一个元素和后面的每一个元素进行比较,如果后面有比第一个元素小的就交换这两个元素
比较下来会得到第最小的一个元素,放在第一个位置,然后依次拿着后面每一个元素依次这样比较,
每次都会得到一个最小的元素,排序完就是从小到大排序
例如:int[] arr={31,23,79,65,16} arr.length=5,将这个数组arr安照选择排序算法来重新排序
思路分析:
第一轮比较: i=0时,j=1,2,3,4 (即j=1;j<5;j++)
{31,23,79,65,16} 31>23 交换 arr[0]与arr[1]比较--->j=1:arr[0] 比 arr[1]=arr[j]
{23,31,79,65,16} 23<79 不交换 arr[0]与arr[2]比较--->j=2:arr[0] 比 arr[2]=arr[j]
{23,31,79,65,16} 23<65 不交换 arr[0]与arr[3]比较--->j=3:arr[0] 比 arr[3]=arr[j]
{23,31,79,65,16} 23>16 交换 arr[0]与arr[4]比较--->j=4:arr[0] 比 arr[4]=arr[j]
最终排序{16,31,79,65,23}得出一个最小元素arr[0]=16放在首位 i=0,arr[0]=arr[i]
第二轮比较: i=1时,j=2,3,4 (即j=2;j<5;j++)
{31,79,65,23} 31<79 不交换 arr[1]与arr[2]比较--->j=2:arr[1] 比 arr[2]
{31,79,65,23} 31<65 不交换 arr[1]与arr[3]比较--->j=3:arr[1] 比 arr[3]
{31,79,65,23} 31>23 交换 arr[1]与arr[4]比较--->j=4:arr[1] 比 arr[4]
最终排序{23,79,65,31} 得出一个最小元素arr[1]=23 此时还是arr[i]与arr[j]相比
第三轮比较: i=2时,j=3,4 (即j=3;j<5;j++)
{79,65,31} 79>65 交换 arr[2]与arr[3]比较--->j=3:arr[2] 比 arr[3]
{65,79,31} 65>31 交换 arr[2]与arr[4]比较--->j=4:arr[2] 比 arr[4]
最终排序{31,79,65} 得出一个最小元素arr[2]=31 此时还是arr[i]与arr[j]相比
第四轮比较: i=3时,j=4 (即j=4;j<5;j++)
{79,65} 79>65 交换 arr[3]与arr[4]比较--->j=4:arr[2] 比 arr[4]
最终得出小的元素是arr[3]=65
i=0时,j=1,2,3,4 (即j=1;j<5;j++) i=0,?=1
i=1时,j=2,3,4 (即j=2;j<5;j++)-->j=?;j<5;j++ i=1,?=2 ======》?=i+1
i=2时,j=3,4 (即j=3;j<5;j++) i=2,?=3
i=3时,j=4 (即j=4;j<5;j++) i=3,?=4
从上面可以看出还是四轮循环,每轮里面又进行循环,外层是i=0;i<arr.length-1;i++
而内层是j=i+1;j<arr.length;j++
代码实现如下:
public class ArrayDemo{
public static void main(String[] args){
//1.定义一个数组
int[] arr={31,23,79,65,16};
//2.调用selectSort方法
selectSort(arr);
//3.将排序完的数组打印出来,即遍历
for(int i=0; i<arr.length; i++){
System.out.println(arr[i]);
}
}
//将上述第二步拿下来定义成一个方法
//参数:方法里面不断改变的值,即数组,随便给一个数组都可以用这个方法排序
//返回值:最后结果是排序数组,没有计算值,不需要返回值
public static void selectSort(int[] arr){
//2.用选择排序对数组进行排序
for(int i=0; i<arr.length-1; i++){ //控制外层循环
for(int j=i+1; j<arr.length; j++){ //控制里层循环
if(arr[i]>arr[j]){ //循环里面将arr[i]与arr[j]相比,满足条件就交换
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
}
}