选择排序(思路分析+疑问解析)

思路:

原始的数组 : 101, 34, 119, 1

第一轮排序 :   1, 34, 119, 101

第二轮排序 :   1, 34, 119, 101

第三轮排序 :   1, 34, 101, 119

 

思路:

1. 选择排序一共有 数组大小 - 1 轮排序

2. 每1轮排序,又是一个循环, 循环的规则(代码)

2.1假定当前这个数是最小数

2.2 然后和后面的每个数进行比较,如果发现有比当前数更小的数,就重新确定最小数,并得到下标

2.3 遍历到数组的最后时,就得到本轮最小数和下标

2.4 交换

package sort;

import java.util.Arrays;
        /**
         * 思路:
         * 1. 选择排序一共有 数组大小 - 1 轮排序
         * 2. 每1轮排序,又是一个循环, 循环的规则(代码)
         * 2.1先假定当前这个数是最小数
         * 2.2 然后和后面的每个数进行比较,如果发现有比当前数更小的数,就重新确定最小数,并得到下标
         * 2.3 当遍历到数组的最后时,就得到本轮最小数和下标
         * 2.4 交换
         * 3. 比如这是第一次循环,则最小值交换到第一个位置的地方(最小),
         *          第二轮循环,最小值交换到第二个位置的地方(较小), 以此下去
         * 在判断大小值的过程中,因为每轮内循环找到的是当前数组中最小的值,
         * 且位置已经交换好,已经有序,不再参与以后的比较过程中
         * (1)问:为什么第一个for外循环length - 1 ,第二个for内循环arr.length?
         *   答: 数组中有四个元素 比较三轮找出来三个较小值,前三个数据有序,则剩下的一个数据就不用再比较了(外循环)
         *       和后面的每个数进行比较,除了与自己比较(内循环)
         * (2)问:if(minIndex != i)什么意思
         *    答:如果最小值下标和原来的下标一样,就不用交换,
         * (3)内循环负责找出该论最小值的下标,外循环负责重复寻找最小值的下标
         * */
public class SelectSort{
    public static void main(String[] args) {
        int arr[] = {3, 9, -1, 10, 20};
        selectSort(arr);
        System.out.println(Arrays.toString(arr));
    }
    public static void selectSort(int[] arr) {
        int temp = 0;
        //即第一个是最小值,不必再接着比较,从下一个值开始即可
        for (int i = 0; i < arr.length - 1 ; i++) {//执行数组 - 1次 数组中有四个元素 比较三轮找出来三个最小值,剩下的一个有序
          int minIndex = i;//默认为第一个
            for(int j = i + 1;j < arr.length  ;j++){//这里不用减一,因为和数组中的每一个比较(除了最小值)
                if(arr[minIndex] > arr[j]){//如果最小值比其他数值小,记录下其下标即可
                    minIndex = j;
                }
            }
            //一轮排序中找到值最小的下标,交换即可
            if(minIndex != i){//如果下标和原来一样,就不用交换,否则就交换元素的值 交换值
                temp = arr[minIndex];
                arr[minIndex] = arr[i];
                arr[i] = temp;
            }
        }
    }
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值