排序算法之选择排序

基本介绍

选择排序是从一组数据中,按指定的规则选出某个元素,在按照规定交换位置后达到排序的目的;

排序思想

从头至尾扫描数组,找出最小的一个元素,和第一个元素交换,接着从剩下的元素中继续这种选择和交换方式,最终得到一个有序序列;

代码实现

例子:
给定数组 [3,5, 6, 2, 4],要求按照从左到右、从小到大的顺序进行排序
分析思路:
选择排序一个需要进行数组大小-1轮排序;先假设当前数为最小数,然后和后面每一个数进行比较,如果发现有比当前最小数更小的数,就更新当前最小数和下标;当一轮数组遍历到最后时,就可以获取到本轮最小数和下标,并进行交换;

1)在{3,5,6,2,4}中,我们开始假设第一个数3为最小值,下标为0,进行遍历;5比3大,6比3 大,3 比2大,更新最小值为2,4比2大,遍历结束,进行替换后
结果:{2} {5,6,3,4}
2) 在{5,6,3,4}中,我们开始假设5为最小值,进行遍历,5 比6小,5比3大,更新最小值为3,3比4小,遍历结束,进行替换后
结果:{2,3} {6,5,4}
3) 在{6,5,4}中,我们开始假设6为最小值,进行遍历;发现5比6小,更新最小值为5,进行遍历,4比5小,更新最小值为4,遍历结束,进行替换后
结果:{2,3,4} {5,6}
4) 在{5,6}中,我们开始假设5为最小值,进行遍历;发现5比6小,遍历结束
结果:{2,3,4,5} {6}
最终结果为: 2,3,4,5,6

替换规则:
一轮遍历后,我们将开始保存的最小值arr[i]和记录最小值minNum、下标minIndex对应的值进行替换
arr[minIndex] = arr[i]
arr[i] = minNum;

将上述一步步分析转化代码为如下:

    //选择排序 3 5 6 2 4
        int[] arr = new int[]{3, 5, 6, 2, 4};

        int minIndex = 0;
        int minNum = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (minNum > arr[i]) {
                minIndex = i;
                minNum = arr[i];
            }
        }
        if (minIndex != 0) {
            arr[minIndex] = arr[0];
            arr[0] = minNum;
        }

        System.out.println("第一次选择排序后:" + Arrays.toString(arr));


        minIndex = 1;
        minNum = arr[1];
        for (int i = 2; i < arr.length; i++) {
            if (minNum > arr[i]){
                minIndex = i;
                minNum = arr[i];
            }
        }

        if (minIndex != 1) {
            arr[minIndex] = arr[1];
            arr[1] = minNum;
        }

        System.out.println("第二次选择排序后:" + Arrays.toString(arr));

        minIndex = 2;
        minNum = arr[2];
        for (int i = 3; i < arr.length; i++) {
            if (minNum > arr[i]){
                minIndex = i;
                minNum = arr[i];
            }
        }

        if (minIndex != 2) {
            arr[minIndex] = arr[2];
            arr[2] = minNum;
        }

        System.out.println("第三次选择排序后:" + Arrays.toString(arr));

        minIndex = 3;
        minNum = arr[3];
        for (int i = 4; i < arr.length; i++) {
            if (minNum > arr[i]){
                minIndex = i;
                minNum = arr[i];
            }

        }
        if (minIndex != 3) {
            arr[minIndex] = arr[3];
            arr[3] = minNum;
        }
        System.out.println("第四次选择排序后:" + Arrays.toString(arr));

运行结果:

第一次选择排序后:[2, 5, 6, 3, 4]
第二次选择排序后:[2, 3, 6, 5, 4]
第三次选择排序后:[2, 3, 4, 5, 6]
第四次选择排序后:[2, 3, 4, 5, 6]

选择排序一共有数组大小-1轮排序,遍历到只剩一个数的时候就是数组的最大值;将上面分步骤的代码进行整合,代码如下:

       int[] arr = new int[]{3, 5, 6, 2, 4};
        for (int j = 0; j < arr.length - 1; j++) {
            int minIndex = j;
            int minNum = arr[j];
            for (int i = j+1; i < arr.length; i++) {
                if (minNum > arr[i]) {
                    minIndex = i;
                    minNum = arr[i];
                }
            }
            if (minIndex != j) {
                arr[minIndex] = arr[j];
                arr[j] = minNum;
            }

            System.out.println("第"+(j+1)+"次选择排序后:" + Arrays.toString(arr));
        }

运行结果:

1次选择排序后:[2, 5, 6, 3, 4]2次选择排序后:[2, 3, 6, 5, 4]3次选择排序后:[2, 3, 4, 5, 6]4次选择排序后:[2, 3, 4, 5, 6]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值