• 不要慌,选择排序也是一样简单的


    最最简单的冒泡排序会了吧?如果还不会,那你再回头看看。今天说说选择排序。

    1. 需求

    • 排序前:{4, 6, 8, 7, 9, 2, 10, 1}
    • 排序后:{1, 2, 4, 5, 7, 8, 9, 10}

    2. 选择排序原理

    选择排序的主要原理:

    1. 每一次遍历的过程中,都假定第一个索引处的元素是最小值,和其他索引处的值依次进行比较。如果当前索引处的值大于其他某个索引处的值,则假定其他某个索引出的值为最小值,最后可以找到最小值所在的索引。
    2. 交换第一个索引处和最小值所在的索引处的值。

    动图展示如下:
    在这里插入图片描述
    排序整体过程大致如下:
    在这里插入图片描述

    3. API设计

    类名Selection
    构造方法Selection():创建Selection对象
    成员方法1. public static void sort(Comparable[] a):对数组内的元素进行排序。
    2. private static boolean greater(Comparable v, Comparable w):判断v是否大于w。
    3. private static void exchange(Comparable[] a, int i, int j):交换 a 数组中索引 i 和索引 j 处的值。

    4. 代码实现

    public class Selection {
    
      public static void sort(Comparable[] a) {
        for (int i = 0; i < a.length - 1; i++) {
          // 假定本次遍历,最小值所在索引是i
          int minIndex = i;
          for (int j = i + 1; j < a.length; j++) {
            if (greater(a[minIndex], a[j])) {
              minIndex = j;
            }
          }
          exchange(a, i, minIndex);
        }
      }
    
      private static boolean greater(Comparable v, Comparable w) {
        return v.compareTo(w) > 0;
      }
    
      private static void exchange(Comparable[] a, int i, int j) {
        Comparable temp = a[i];
        a[i] = a[j];
        a[j] = temp;
      }
    
      public static void main(String[] args) {
        Integer[] a = {4, 5, 6, 3, 2, 1};
        sort(a);
        System.out.println(Arrays.toString(a));
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    5. 时间复杂度分析

    选择排序使用了双层for循环,其中外层循环完成了数据交换,内存循环完成了数据比较。所以我们分别统计数据交换次数和数据比较次数:

    • 数据比较次数:(N-1)+(N-2)+(N-3)+…+2+1=((N-1)+1)*(N-1)/2=N^2/2-N/2
    • 数据交换次数:N-1

    总执行次数:N^2/2-N/2+(N-1)=N^2/2+N/2-1

    根据大O推导法则,保留最高阶项,去除常数因子,时间复杂度为O(N^2)。

    源代码:https://gitee.com/anbang713/day-day-up/blob/master/algorithm/src/main/java/com/study/algorithm/sort/Selection.java

  • 相关阅读:
    设计模式之组合模式与观察者模式应用例题
    Typora下载安装 (Mac和Windows)图文详解
    Java设计模式-单例模式
    [JAVAEE]—进程和多线程的认识
    1393. 股票的资本损益
    【虚拟线程】java21虚拟线程用法 限流等
    为什么我的idea commit changes变样了,很难用现在
    SpringBoot 项目实战 ~ 7. 短信验证码登录
    【职场成长】一篇文章,讲清复盘!
    一文学会使用WebRTC API
  • 原文地址:https://blog.csdn.net/Anbang713/article/details/126328696