选择排序也属于内部排序的一种,是从"欲排序的数据"中,按照指定的规则选出某一元素,再根据规定交换位置后达到排序的目的
选择排序(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],那么就顺利的完成了交换,那么第一轮选择排序就执行完了,接下来继续执行第二轮, 执行第二轮的时候我们要除去已经排好序的第一个位置的元素,所以我们就将数组中第二个值(也就是除了第一个值以外的第一个值,哈哈)看做是最小值(这里的最小值指的是除去第一个位置之外的最小值),然后将这个最小值和索引记录下来,重复之前的操作即可
选择排序一共有数组长度减一轮排序
每一轮排序又是一个循环,那么如何实现这个循环?
①先假定"待排序序列"中第一个数就是最小的数
②然后和后面的每个数进行比较,如果发现有比当前更小的数,则重新确定最小数,并得到新的下标
③当遍历到数组的最后时,就得到了本轮的最小值和下标
④进行交换
temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
其实这个也就是在冒泡排序中的实现
而在选择排序中也是这样实现的,不过在选择排序中我们有一个每一趟的最小值的概念,所以我们使用一个minIndex来记录了最小值的位置,使用min来记录了最小值的值, 对于一趟中的最小值应该出现的位置我们记录为y,那么就有如下操作:(交换最小值位置和最小值应该出现的位置的数值 —> 从而让最小值应该出现的位置变为最小值)
min = arr[minIndex];
arr[minIndex] = arr[y];
arr[y] = min;