选择排序算法(思路分析) [数据结构][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;
  • 其实这个也就是在冒泡排序中的实现

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

    • min = arr[minIndex];
      arr[minIndex] = arr[y];
      arr[y] = min;
      

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值