不会吧,不会吧,居然还有人不知道选择排序——最详解释,小白一看就会

选择排序
  • 原理:按照从矮到高(从高到矮)的顺序摆放好
    在这里插入图片描述

  • 步骤:第一次从未排序的序列中选出最小的一个元素,存放在第一个位置,然后再从剩余的未排序序列找到最小的元素,放在已排序序列的末尾

  • 编程思路(从小到大)

    • 外层循环:第一次找到最小的数,和第一个数交换位置,第二次从第一个数之后找最小的数,和第二个数交换位置,第三次从第二个数之后找最小的数,和第三个数交换位置。。。。。。。
    • 内层循环:第一次假设第一个数最小,拿这个数依次和后面的数比较大小,只要有比第一个数还小的数,那么就假设这个数为最小的数
    • 举例:以{1,2,4,3,5,0}为例,
      • 第一次循环:假设最小的是1,然后1和2比,发现1比2小,就假设1是最小,然后再和4比,再和3比,再和5比,最后假设的是0最小,那么0和1交换位置,0就在第一位了。变成{0,2,4,3,5,1}把0放在第1位
      • 第二次循环:从0后面开始,假设最小为2,然后和4相比,和1相比,发现1比2小,就假设1最小,最后1和2交换位置变成{0,1,4,3,5,2}把1放在第2位
      • 第三次循环:{0,1,2,3,5,4}把2放在第3位
      • 第四次循环:{0,1,2,3,5,4}本来假设的3最小,不用交换位置
      • 第五次循环:{0,1,2,3,4,5}把4放在第5位,第六位自动归为
    • 总结思路
      • 六个数,循环五次(length-1)
      • 假设最小的数应该放在中间值里(temp)
      • 第一次循环比较五次,第二次循环比较4次,第三次循环比较3次,第四次循环比较2次,第五次循环比较一次(外层i增长)
      • 如果有刚好假设的最小的数就在最开始的位置不用交换位置(判断中间值是否改变)
  • 代码实现

    package cn.javase.selfstudy;
    
    public class ArraySelectSort {
        public static void main(String[] args) {
            int[] arr = new int[]{10, 12, 33, 6, 100, 90, 46, 1, 5, 7, 3};
            System.out.print("[");
            for (int i = 0; i < arr.length; i++) {
                System.out.print(arr[i] + (i < arr.length - 1 ? "," : "]"));
            }//6 7 8 9遍历原数组元素
            System.out.println();
            System.out.println("---------------------");
            int min;
            for (int i = 0; i < arr.length - 1; i++) {
                min = i;//定义一个中间值暂存假设最小值的下标
                for (int j = i + 1; j < arr.length; j++) {
                    if (arr[j] < arr[min]) {//比较是否比假设的最小值小
                        min = j;//如果小就把该数的下标给中间值
                    }
                }
                if (i != min) {//判断假设的最小值下标是否有变化
                    arr[i] = arr[i] + arr[min];
                    arr[min] = arr[i] - arr[min];
                    arr[i] = arr[i] - arr[min];
                }//21 22 23把最小值放在未排序列的第一位
                System.out.print("[");
                for (int x = 0; x < arr.length; x++) {
                    System.out.print(arr[x] + (x < arr.length - 1 ? "," : "]"));
                }//25 26 27 打印每一次交换后的结果
                System.out.println();
            }
            System.out.println("---------------------");
            System.out.print("[");
            for (int i = 0; i < arr.length; i++) {
                System.out.print(arr[i] + (i < arr.length - 1 ? "," : "]"));
            }//打印排序后的数组
            System.out.println();
        }
    }
    
    
    [10,12,33,6,100,90,46,1,5,7,3]//原数组
    ---------------------
    [1,12,33,6,100,90,46,10,5,7,3]//找到最小数1放在第1位
    [1,3,33,6,100,90,46,10,5,7,12]//找到最小数3放在第2位
    [1,3,5,6,100,90,46,10,33,7,12]//找到最小数5放在第3位
    [1,3,5,6,100,90,46,10,33,7,12]//找到最小数6放在第4位
    [1,3,5,6,7,90,46,10,33,100,12]//找到最小数7放在第5位
    [1,3,5,6,7,10,46,90,33,100,12]//找到最小数10放在第6位
    [1,3,5,6,7,10,12,90,33,100,46]//找到最小数12放在第7位
    [1,3,5,6,7,10,12,33,90,100,46]//找到最小数33放在第8位
    [1,3,5,6,7,10,12,33,46,100,90]//找到最小数46放在第9位
    [1,3,5,6,7,10,12,33,46,90,100]//找到最小数90放在第10位,100自动归位
    ---------------------
    [1,3,5,6,7,10,12,33,46,90,100]//排序后的数组
    

猜你喜欢

转载自blog.csdn.net/weixin_44115522/article/details/107432320