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

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));

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值