• 选择排序算法(思路分析) [数据结构][Java]


    选择排序算法(思路分析)

    基本介绍:

    选择排序也属于内部排序的一种,是从"欲排序的数据"中,按照指定的规则选出某一元素,再根据规定交换位置后达到排序的目的

    选择排序思想(以升序排序为例讲解):

    选择排序(Select Sorting) 也是一种简单的排序方法,它的基本思想是: 第一次从arr[0] ~ arr[n-1]中选出最小值与arr[0]交换,第二次从 arr[1] ~ arr[n-1]中选出最小值与arr[1]交换,第i次从arr[i-1] ~ arr[n-1]中选出最小值与arr[i-1]交换 , 第n-1次从arr[n-1-1] ~ arr[n-1]中选出最小值与arr[n-1-1]交换,总共通过n-1次,就得到了一个从小到大排序的有序序列

    选择排序的思路图解:

    在这里插入图片描述

    选择排序算法的思路分析:

    • 这里我们以升序排列为例:

    首先我们假定数组中的第一个元素就是最小值,并将这个位置的索引记录下来(记录到int minIndex中),我们也要将数组中第一个位置的元素作为最小值记录下来(记录到int min中),因为可能会涉及到两个位置的数值的交换,而交换两个位置的数值我们就要使用到一个临时变量来完成,不如我们就直接定义一个int min来接收最小值,然后后用min和数组中的其他的元素一次进行比较,如果数组中有比这个min的值更加小的值,就将这个min的值修改为这个更小的值,并将这个位置记录下来,一直到比价到数组的末尾,然后我们就拿到了数组中所有元素的最小值,这个时候再将这个最小值和第一个位置进行一个交换,这个时候我们的最小值已经保存到了临时变量min中,所以直接让arr[0] (也就是数组中的第一个元素)赋值给arr[minIndex] --> 即使这里覆盖了原本的arr[minIndex]的值,但是也不影响,因为我们已经提前将最小值保存了下来,然后将min(min中保存了我们找寻出的最小值)的值赋给arr[0],那么就顺利的完成了交换,那么第一轮选择排序就执行完了,接下来继续执行第二轮, 执行第二轮的时候我们要除去已经排好序的第一个位置的元素,所以我们就将数组中第二个值(也就是除了第一个值以外的第一个值,哈哈)看做是最小值(这里的最小值指的是除去第一个位置之外的最小值),然后将这个最小值和索引记录下来,重复之前的操作即可

    选择排序算法的小结:

    1. 选择排序一共有数组长度减一轮排序

      • 为什么有数组长度减一轮排序?
        • 因为选择排序我们是每次都取出"待排序队列中"一个最小值(其实是最大值或者最小值 , 只不过这里我们就最小值的情况进行分析),那么我们第一次要找到最小值放到第一个位置上,第二次要找到待排序队列中的最小值放到第二个位置上,一直重复,知道n-1次即可排好,n-1次我们一共找了n-1个"最小值" —> 这里的最小值说的是待排序队列中的最小值,每次待排序队列中的最小值都不一样, 然后我们找到了n-1个最小值,那么剩下的n个值中的最后一个值肯定是比这n-1个值都小,所以就不用执行第n次排序了 —> 所以我们说冒泡排序一共要执行: 数组长度 - 1次
    2. 每一轮排序又是一个循环,那么如何实现这个循环?
      ①先假定"待排序序列"中第一个数就是最小的数
      ②然后和后面的每个数进行比较,如果发现有比当前更小的数,则重新确定最小数,并得到新的下标

      • 一旦比较时有比第一个位置的数据值小的位置,那么我们就要让该位置作为最小值所在位置

      ③当遍历到数组的最后时,就得到了本轮的最小值和下标

      ④进行交换

      • 这里的交换就是指交换第一个位置和最小值所在的位置的数据值
        • 我们在交换前可以做一个判断,如果第一个位置就是最小值位置,naem就不用交换了
    我们在进行交换操作时要有两样东西:
    1. 两个位置的索引(x和y)
    2. 需要一个临时变量
    然后执行下面的操作即可完成交换操作:
    temp = arr[x];
    arr[x] = arr[y];
    arr[y] = temp;
    
    • 1
    • 2
    • 3
    • 其实这个也就是在冒泡排序中的实现

    • 而在选择排序中也是这样实现的,不过在选择排序中我们有一个每一趟的最小值的概念,所以我们使用一个minIndex来记录了最小值的位置,使用min来记录了最小值的值, 对于一趟中的最小值应该出现的位置我们记录为y,那么就有如下操作:(交换最小值位置和最小值应该出现的位置的数值 —> 从而让最小值应该出现的位置变为最小值)

      • min = arr[minIndex];
        arr[minIndex] = arr[y];
        arr[y] = min;
        
        • 1
        • 2
        • 3

    选择排序核心思想 : 选择最大或者最小值, 与指定位置交换

  • 相关阅读:
    Linux的介绍和安装
    curl-带参数GET/POST请求
    CocosCreator 3.x热更新学习
    湘潭大学 2023年下学期《C语言》作业0x03-循环1 XTU OJ 1094,1095,1096,1112,1113
    python 中yield的使用
    redis相关文章汇总
    MySQL中为什么要使用索引合并(Index Merge)
    Arthas实操-Web Console
    美国这几年的人口死亡数据
    鸿蒙:实现两个Page页面跳转
  • 原文地址:https://blog.csdn.net/m0_57001006/article/details/126418617