6.3 *直接选择排序
排序是指一堆数字按照从小到大或者从大到小的顺序排序,通常我们把数字保存在数组里,然后排序后,数组里面的数字就按序排好了。
排序有非常多的算法,其中有一种比较低级的算法叫做直接选择排序,使用的是二重循环,这一节我们就来学习一下。
首先有一个数组:
int arr[]={23 , 14 , 56 , 1 , 35 , 89 , 99 , 65 , 73 , 44};
我们最终要得到一个从小到大排序的数组。
算法如下:
1.i=0,len=arr的长度
2.如果i小于len,进入3,否则算法结束
3.找到从i开始到数组末尾(也就是下标为len-1的元素)的最小值的下标k
4.将这个最小值和i互换,也就是a[i]和a[k]互换
5,i++,回到第2步
以下是算法的应用在上面数组的具体演示。
下图是原数组,准备开始循环,带下划线的值是i为下标所在的值,也是可能会和别的值互换的值:

第一轮循环,从i(i为0)开始到数组末尾,找到这里面最小的数字,然后和下标0的元素互换,这样下标为0的元素就是最小的。 这里找到的值是下标为3的值1,互换后如下(灰色底表示两者已经互换过),同时i的值增加1,第一次循环结束:

第二轮循环,从i(i=1)开始到数组末尾(此时i为1,也就是从14开始一直到数组末尾),找到这里面最小的数字,然后和下标为i的元素互换。这次循环没有移动元素,14就是这里最小的数字,同时i的值增加1,第二轮循环结束:

第三轮循环,从i(i=2)开始到数组末尾,找到这里最小的元素然后和下标为i的元素互换。 循环结束后如下图:

第四轮循环,从i(i=3)开始到数组末尾,找到这里最小的元素然后和下标为i的元素互换。 循环结束后如下图:

第五轮循环,从i(i=4)开始到数组末尾,找到这里最小的元素然后和下标为i的元素互换。 循环结束后如下图:

第六轮循环,从i(i=5)开始到数组末尾,找到这里最小的元素然后和下标为i的元素互换。 循环结束后如下图:

第七轮循环,从i(i=6)开始到数组末尾,找到这里最小的元素然后和下标为i的元素互换。 循环结束后如下图:

第八轮循环,从i(i=7)开始到数组末尾,找到这里最小的元素然后和下标为i的元素互换。 循环结束后如下图:

第九轮循环,从i(i=8)开始到数组末尾,找到这里最小的元素然后和下标为i的元素互换。 循环结束后如下图:

最后一轮循环发现,数组的最后一个元素不需要再计算了,它肯定是最大的元素。所以i=8算法就结束了,也就是循环次数是数组的长度减1.
找到从i开始到数组结束的的最小值,然后换到i的位置。
这样,第一次找的就是最小值;
第二次找的是第二小的值;
第三次找的是第三小的值;
……
第i次找的是第i小的值;
上面的第3步,需要一次遍历才能做到,而且记录的是下标,而不是最小值,否则无法互换。而为啥要换走找到的最小值呢,因为不换走的话,下一个找到的最小值还可能是它。