选择排序算法(思路分析)
基本介绍:
选择排序也属于内部排序的一种,是从"欲排序的数据"中,按照指定的规则选出某一元素,再根据规定交换位置后达到排序的目的
选择排序思想(以升序排序为例讲解):
选择排序(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],那么就顺利的完成了交换,那么第一轮选择排序就执行完了,接下来继续执行第二轮, 执行第二轮的时候我们要除去已经排好序的第一个位置的元素,所以我们就将数组中第二个值(也就是除了第一个值以外的第一个值,哈哈)看做是最小值(这里的最小值指的是除去第一个位置之外的最小值),然后将这个最小值和索引记录下来,重复之前的操作即可
选择排序算法的小结:
-
选择排序一共有数组长度减一轮排序
- 为什么有数组长度减一轮排序?
- 因为选择排序我们是每次都取出"待排序队列中"一个最小值(其实是最大值或者最小值 , 只不过这里我们就最小值的情况进行分析),那么我们第一次要找到最小值放到第一个位置上,第二次要找到待排序队列中的最小值放到第二个位置上,一直重复,知道n-1次即可排好,n-1次我们一共找了n-1个"最小值" —> 这里的最小值说的是待排序队列中的最小值,每次待排序队列中的最小值都不一样, 然后我们找到了n-1个最小值,那么剩下的n个值中的最后一个值肯定是比这n-1个值都小,所以就不用执行第n次排序了 —> 所以我们说冒泡排序一共要执行: 数组长度 - 1次
- 为什么有数组长度减一轮排序?
-
每一轮排序又是一个循环,那么如何实现这个循环?
①先假定"待排序序列"中第一个数就是最小的数
②然后和后面的每个数进行比较,如果发现有比当前更小的数,则重新确定最小数,并得到新的下标- 一旦比较时有比第一个位置的数据值小的位置,那么我们就要让该位置作为最小值所在位置
③当遍历到数组的最后时,就得到了本轮的最小值和下标
④进行交换
- 这里的交换就是指交换第一个位置和最小值所在的位置的数据值
- 我们在交换前可以做一个判断,如果第一个位置就是最小值位置,naem就不用交换了
我们在进行交换操作时要有两样东西:
- 两个位置的索引(x和y)
- 需要一个临时变量
然后执行下面的操作即可完成交换操作:
temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
-
其实这个也就是在冒泡排序中的实现
-
而在选择排序中也是这样实现的,不过在选择排序中我们有一个每一趟的最小值的概念,所以我们使用一个minIndex来记录了最小值的位置,使用min来记录了最小值的值, 对于一趟中的最小值应该出现的位置我们记录为y,那么就有如下操作:(交换最小值位置和最小值应该出现的位置的数值 —> 从而让最小值应该出现的位置变为最小值)
-
min = arr[minIndex]; arr[minIndex] = arr[y]; arr[y] = min;
-