排序算法-选择排序(java实现)

选择排序的核心思想是从数据元素中选出最值与第一个元素/最后一个进行交换,注意是找到最值后才交换,不是边找边交换,以数组为例
第一次 arr[0] ~a[n-1] 找出最值与a[0]交换
第二次arr[1]~a[n-1] 找出最值与a[1]交换
第三次arr[2]~a[n-1] 找出最值与a[2]交换

以此类推

选择排序:
时间复杂度是O(n2)
最好情况O(n2)
最坏情况O(n2)
空间复杂度 O(1)
选择排序不占用额外内存,是不稳定算法。

图解选择排序,红色表示已经确定的数据元素
在这里插入图片描述
根据上图我们可以发现,选择排序一共有数组大小-1轮排序,每一轮排序,又是一个循环。我们可以先假定第一个数是最值,然后和后面的每一个数进行比较,如果发现有比当前数更小/大的数,就重新确定最值,当遍历到数组的最后,就可以得到最值,交换即可。

核心代码 从小到大为例

public static void selectSort(int[] arr){

        //第一个循环表示排序次数
       for (int i = 0; i < arr.length - 1; i++) {
           //最小值的索引
           int minIndex = i;
           //最小值
           int min = arr[i];
           //第二个循环表示每一次元素的排序
           for (int j = i+1; j < arr.length; j++) {
               if (min>arr[j]){
                   //重置最小值
                  minIndex = j;
                  min = arr[j];
               }
           }
           //判断最值下标是否有变化,没有变化不需要交换
           if (minIndex != i){
               //交换
               arr[minIndex] = arr[i];
               arr[i] = min;
           }

       }
   }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值