本文着重讲解选择排序:
原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕。
举例:
如图,是五个无序的数据。接下来就需要使用选择排序将其进行排序。
思路:
先默认选定一个数据,认为是最小的。让其与后面的所有数据进行比较,如发现比自己更小的则交换位置,当本轮比较完成以后,前面的数据则变成最小的。
五个数据 默认比较四轮 就可以确定所有数据的顺序
演示过程:
第一轮比较:
默认选定下标为0的位置上的数据为最小的。让他与后面所有数据进行比较
比较的位置为:
0-1 0-2 0-3 0-4
交换了下标为0和下标为1 的数据 ,发现2是在此数组中最小的数据,此时已经确定了下标为0的数据。 结 果为: 2,9,5,4,7
第二轮比较:
第二轮中我们可以选择下标为1 的位置默认为本轮最小数据,依次与后面数据进行对比。
比较位置:
1-2 1-3 1-4
交换了下标为1和2 ,结果为 2,5,9,4,7
然后继续进行对比,又交换了下标为1和下标为3 结果为: 2,4,9,5,7
第三轮比较:
第三轮比较中默认把下标为2 最为最小值,依次跟后面数据进行比较
比较位置:
2-3 2-4
第三轮中 交换了 下标为2和3 结果为:2,4,5,9,7
第四轮:
默认选定下标为3的位置上的数据为最小的。让他与后面所有数据进行比较
比较位置:
3-4
比较了一次,交换了下标3和4位置上的数据,结果为: 2,4,5,7,9
至此:我们将这个无序数组变得有序。
总结规律:
1 五个数据比较四轮。比较轮数为 数组.Length-1
2 默认选择一个位置跟后面所有数据进行比较,所以每轮比较次数为
第一轮: 4次
第二轮: 3次
第三轮: 2次
第四轮: 1次
3 比较过程中发现后面数据比自己小的时候,进行数据交换
以上三条规律 则可以帮助我们来实现代码的推导:
至此为止,选择排序就已经实现了。
但是我们对于代码的效率的追求是无止境的。仔细观察会发现,在每轮比较中,都有可能交换多次数据。比如 第二轮中 ,先交换了 1 和 2的数据,然后又交换了 1和3的数据。这是因为2上面的数据虽然比1 小,但是 并不是后面最小的数据,3此时最小的。这样我们就涉及到 多次交换数据。为了提高执行效率,可以先当比较1和2的时候发现2是比1小,则默认把当前最小的数据变成2,让2与后面的3比较,如果发现3比2小,则 默认当前最小的数据为3 以此类推,当把所有数据 进行比较后会得到最小的数据。然后在进行交换数据。这样我们就看可以将交换数据的次数控制在 小于等于比较轮数的范围内。进而提高执行效率。
代码如下:
至此,优化后的代码实现。
閱讀更多 跟老司機學Java 的文章