数据结构小白之选择排序算法

1.选择排序

1.1 思路

先准备一个数组 int[]arr={101,119,34,1}

从欲排序的数据中,按照指定的规则选出某一元素,再按照规定交换位置后达到排序的目的

规则:

第一次从arr[0]-arr[n-1]中选取最小值,和arr[0]交换

第二次从arr[1]-arr[n-1]中选取最小值,和arr[1]交换

第三次从arr[2]-arr[n-1]中选取最小值,和arr[2]交换

* ... *

第n-1从arr[n-2]-arr[n-1]中选取最小值,和arr[n-2]交换

1.2举个栗子

1.2.1: 准备一个数组,加上一些显示操作

 int[] arr = {101, 119, 34, 1};
        System.out.print("排序前:");
        System.out.println(Arrays.toString(arr));

1.2.2: 第一轮操作

  public static int[] selectedFirstSort(int[] arr) {

        /**
         * 内层循环确定逻辑
         *
         * 外层循环确定逻辑执行的次数(层次)
         * */
        //第一轮 1 34 119 101

        // 假设数组下标为0的值为最小值
        int minIndex = 0;
        int min = arr[minIndex];
        for (int j = 0 + 1; j < arr.length; j++) {
            //让数和后面的数进行比较
            if (min > arr[j]) {
                //假定的最小值不是最小的,所以要进行重置最小值
                min = arr[j];
                minIndex = j;
            }
        }
        //传统的交换方法
        //开始进行交换 将最小值放在arr[0]
        if (minIndex != 0) {
            arr[minIndex] = arr[0];
            arr[0] = min;
        }

        //System.out.println("第一轮过后:" + Arrays.toString(arr));
        return arr;

    }

  

1.2.3: 第二轮操作

 public static int[] selectedSecondSort(int[] arr) {

        //第一轮 1 34 119 101

        // 假设数组下标为0的值为最小值
        int minIndex = 1;
        int min = arr[minIndex];
        for (int j = 1 + 1; j < arr.length; j++) {
            //让数和后面的数进行比较
            if (min > arr[j]) {
                //假定的最小值不是最小的,所以要进行重置最小值
                min = arr[j];
                minIndex = j;
            }
        }
        //开始进行交换 将最小值在arr[1]
        if (minIndex != 1) {
            arr[minIndex] = arr[1];
            arr[1] = min;
        }

        //System.out.println("第二轮过后:" + Arrays.toString(arr));
        return arr;
    }

.....

1.2.3 找到规律,在外面套一个外循环

//选择排序
    public static int[] selectAllSort(int []arr){
        for(int i=0;i<arr.length-1;i++){
            int minIndex = i;
                int min = arr[minIndex];
                for (int j = i + 1; j < arr.length; j++) {
                    //让数和后面的数进行比较
                    if (min > arr[j]) {
                        //假定的最小值不是最小的,所以要进行重置最小值
                        min = arr[j];
                        minIndex = j;
                    }
            }
            //开始进行交换 将最小值放在arr[0]
            if (minIndex != i) {
                arr[minIndex] = arr[i];
                arr[i] = min;
            }

            //System.out.println("第"+(i+1)+"轮过后:" + Arrays.toString(arr));
        }
        return arr;
    }

1.2.4 调一波主函数

public static void main(String[] args) {
        int[] arr = {101, 119, 34, 1};
        System.out.print("排序前:");
        System.out.println(Arrays.toString(arr));
        int[] firstArray = selectedFirstSort(arr);
        System.out.println("第一轮过后:"+Arrays.toString(firstArray));
        //第一轮过后 1 119 34 101
        int[] secondArray = selectedSecondSort(firstArray);
        System.out.println("第二轮过后:"+Arrays.toString(secondArray));
        //第二轮过后 1 34 119 101
        //需要经过array.length-1轮

        int[]finalArray=selectAllSort(arr);
        System.out.println(Arrays.toString(finalArray));

    }

发布了193 篇原创文章 · 获赞 70 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/Lzinner/article/details/102875351
今日推荐