2011年,C语言老师给我们讲选择排序。
....
我一直很忙,很忙。但是却不知道在忙些什么?
似乎甚至几年的时间都没有接触选择排序。
2019年春节,一次偶然的某一个晚上,再一次看了一次选择排序的过程。
什么是选择排序呢?
选择排序是通过在无序区域内查找最小(或者最大)的元素。并且把这个元素放在数列的起始位置。那么这个元素已经是构成一个有序区域。接下来只要把剩下的无序区域内的元素继续找出最小(或者最大)的元素。同样放置在有序区域的尾巴...依次类推,直到所有的元素全部进入有序区域内。
我想通过一组数据来阐述选择排序的过程。
- 第一轮排序开始。此时所有元素处于无序区域。在无序区域中找出最小的[元素1] 。并且把[元素1] 与无序区域内的第一个元素交换。[元素1] 即被加入到有序区域。
- 第二轮排序开始。在无序区域所有元素中找出最小的[元素2],并且把[元素2]与无序区域内的第一个元素交换。[元素2]即被加入到有序区域。
- 第三轮排序开始。在无序区域所有元素中找出最小的[元素3],由于[元素3]就是无序区域的第一个元素,因此不交换。[元素3]加入到有序区域。
....
以此类推,重复以上的过程,直到第7轮排序结束之后,此时在有序区域内的元素有8个,元素总个数有7个,最后一个自然成为有序区域的元素。
- 每经过一轮排序,有序区域内的元素数量增加1个。
- 如果待排序的元素个数为N。需要经历N-1轮排序。
最后我们使用Java代码来展示上述的算法。
1 private static void sort() { 2 3 Integer[] data = {6,3,2,1,8,9,7,5}; 4 5 6 for(int i=0; i<data.length-1; i++) { 7 8 int k = i; 9 10 for(int j=k; j<data.length; j++) { 11 if(data[j] < data[k]) { 12 k = j; 13 } 14 } 15 16 if(i != k) { 17 int x = data[i]; 18 data[i] = data[k]; 19 data[k] = x; 20 } 21 22 } 23 24 }
从上述代码和流程图中。大致步骤如下:
- 大循环控制轮数,循环的轮数等于元素的个数-1。
- 每一轮,找出无序区域的最小元素,并且把这个最小元素和无序区域的第一个元素交换。