选择排序

选择排序(SELECTION SORT)

原理

初始时在序列中找到最小元素,放在序列的起始位置作为已排序序列;然后,再从剩余未排序的元素中继续寻找最小元素,放到已排序序列的末尾,依此类推,直至所有元素排序完毕。
注意选择排序和冒泡排序的区别:冒泡排序通过依次交换相邻两个顺序不合法元素的位置,从而将当前最小元素放到合适的位置;而选择排序每遍历依次都记住了当前最小元素的位置,最后仅需要一次交换操作即可将其放到合适的位置。

动态效果示意图

在这里插入图片描述

思路

给定数组 a
第一趟排序,在待排序的 n 个元素中选出最小的那个,将它与 a[1] 交换;
第二趟排序,在待排序数据 a[2] ~ a[n] 中选出最小的数据,将它与 a[2] 交换;
第三趟排序,…
依次类推
第 n - 1 趟排序,在待排序的 a[n-1] ~ a[n] 中选出最小的数据,将它与 a[n-1] 交换;
排序完成。

  • 举例说明
    5,2,8,4,9,1
    ============================================================================================
    第一趟排序:原始数据:5,2,8,4,9,1
    最小数据为1,1 放在首位,也就是 1 和 5 交换位置
    排序结果:1,2,8,4,9,5
    ============================================================================================
    第二趟排序:除 1 以外的数据 2,8,4,9,5 进行比较,2 最小
    自己和自己交换
    排序结果:1,2,8,4,9,5
    ============================================================================================
    第三趟排序:除 1、2 以外的数据 8,4,9,5 进行比较,4 最小
    8 和 4 交换
    排序结果:1,2,4,8,9,5
    ============================================================================================
    第四趟排序:除 1、2、4 以外的数据 8,9,5 进行比较,5 最小
    8 和 5 交换
    排序结果:1,2,4,5,9,8
    ============================================================================================
    第五趟排序:除 1、2、4、5 以外的数据 9,8 进行比较,8 最小
    9 和 8 交换
    排序结果:1,2,4,5,8,9
    ============================================================================================

每一趟获得最小数的方法;使用 for 循环进行比较,定义一个变量 temp,首先前两个数进行比较,把较小的数放在 temp 中,然后用 temp 再去跟剩下的数据比较,如果出现比 temp 小的数据,就用它来替代 temp 中原有的数据。

 //选择排序算法
    public static void selectionSort(int[] arr){
        for (int i = 0; i < arr.length-1; i++) { //控制循环的趟数
            int k = i; //用k来记录最小数的位置
            for (int j = i+1; j < arr.length; j++) { //利用循环找到未排序序列中最小的那个数
                if(arr[j] < arr[k])
                    k = j;
            }
            //内层循环结束,找到本次循环的最小数,进行交换
            if(i != k){
                int temp = arr[i];
                arr[i] = arr[k];
                arr[k] = temp;
            }
        }
    }
选择排序算法改进

选择排序的思想是在要排序的一组数中,选出最小的那个数,然后与第一位置的数进行交换;然后再剩下的数中,找出最小的那个数与第二个数进行交换,直到第 n-1 个数与第 n 个数比较为止。而二元选择排序,顾名思义,从待排序的数组中找出一个最大值和一个最小值,分别与第一个数、最后一个数进行交换,这样可以使选择排序的时间复杂度降低,所以外层循环从 n 次变为了 n/2 次。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值