import java.util.Arrays;

/**
 * @author WanJl
 * @version 1.0
 * @title Demo05
 * @description 数组排序-选择排序
 * @create 2026/7/16
 */
public class Demo05 {
    /*
        选择排序：
        选择排序的思路要比冒泡排序更聪明一点，冒泡排序是不断的交换相邻的元素，而选择排序，是每轮只做一次交换。
        选择的思路是 每一轮从剩余未排序的元素中找出最小的元素，直接把它放到未排序部分的第1位。
        核心思路：每一轮从未排序区间选出最小值，与未排序区间的第1个元素进行交换。
        优点：交换次数比冒泡更少
        缺点：不稳定，可能会破坏相对顺序
     */
    public static void main(String[] args) {
        /*
            选择排序：每一轮从未排序区间选出最小值，放到已排序区间的末尾
         */

        int[] arr={1,456,782,5,8,4,598,1,46,68,465,74};
        //外层循环：i 既是已排序区间的末尾边界，也是当前要确定的位置
        for (int i = 0; i < arr.length-1; i++) {
            //假设当前未排序区间的第1个元素就是最小的
            int minIndex=i; //假设i就是最小的元素的索引值
            //内层循环：在未排序区间[i+1,arr.length-1] 找到真正的最小值
            for (int j = i+1; j <arr.length; j++) {
                //判断谁才是最小值
                if (arr[j]<arr[minIndex]){
                    minIndex=j; //就更新最小元素的索引值
                }
            }   //当内层循环跑完一轮，就得到了数组的最小元素索引值
            // 如果得到的最小元素索引值 minIndex 和 当前的 i 不想等，
            //那就交换位置
            if (minIndex!=i){
                arr[minIndex]=arr[minIndex]+arr[i];
                arr[i]=arr[minIndex]-arr[i];
                arr[minIndex]=arr[minIndex]-arr[i];
            }
            System.out.println("第"+(i+1)+"轮选择后："+ Arrays.toString(arr));
        }
    }
}
