八大排序算法之选择排序

时间复杂度:O(N^2)
额外空间复杂度:O(1)
是否可实现稳定性:否

思路:

初始化一个变量minIndex用来存储最小数值的下标,每次循环找出最小下标minIndex,然后和当前外层循环最前面的数交换,就能做到每次把本次循环中的最小数值放到最前面

例子:

比如一组数{2,5,1,9}
每次初始化minIndex为当前外循环的最前面的数字,第一次minIndex=0
比较2和5,2<5所以minIndex值不变,再比较2和1,2>1所以minIndex的值变成2
再比较1和9,1<9,minIndex不变,此时所有数值比较完毕,然后交换minIndex和i的值,i代表外层循环的位置
第二次循环,minIndex=1,过程和第一次一样,依次执行下去得到结果

代码:

 public static void selectionSort(int[] arr){
      if (arr==null||arr.length<2){
          return;
      }
      
      /*
      * 选择排序的思想: 遍历数组  初始化一个变量,代表每次循环找到的最小的数的下标
      * 内循环,每一次找的都是最小数的下标,然后每次用当前最小下标的元素和arr[j]比较,
      * 看看当前的下表是否是最小下标 循环结束,minIndex就是这一次循环找到的最小的数的下标
      * 然后交换i和minIndex的下标
      * i代表每次开始的位置也就是每次循环最小的位置
      **/
      for (int i = 0;i<arr.length;i++){
          int minIndex = i;
          for (int j = i+1;j<arr.length;j++){
              minIndex = arr[minIndex] < arr[j]?minIndex:j;
          }
          swap(arr,i,minIndex);
      }
  }

    public static void swap(int[]arr,int i ,int j){
        int temp = 0;
        temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

在这里注意,选择排序是不稳定的,举个例子序列5 8 5 2 9, 我们知道第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 数据结构与算法--排序之冒泡、选择、插入、希尔 我们关注的主要对象是重新排列数组元素的算法,每个元素都有一个主键,...
    sunhaiyu阅读 4,853评论 2 12
  • 该系列文章主要是记录下自己暑假这段时间的学习笔记,暑期也在实习,抽空学了很多,每个方面的知识我都会另起一篇博客去记...
    Yanci516阅读 14,223评论 6 19
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 10,592评论 0 52
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 9,087评论 0 15
  • 总结一下常见的排序算法。 排序分内排序和外排序。内排序:指在排序期间数据对象全部存放在内存的排序。外排序:指在排序...
    jiangliang阅读 5,239评论 0 1