“选择排序”在实际应用中没有“插入排序”那么广泛,但也是我们学习排序算法中不可或缺的一个。“冒泡排序”和“插入排序”都是在两层嵌套循环中慢慢比较元素,不断调整元素的位置。而“选择排序”就更直接了,如果不出手,一旦出手,对应的元素一定就位,元素的位置不会改变。让我们仔细看看它的逻辑。1、什么是“选择排序”?选择排序也是一种非常简单的排序算法。它的思路是把一组待排序的数据分成两段,一段是“已排序”的数据,另一段是“已排序”的“未排序”的数据。当然最开始的时候,里面没有数据“已排序”部分。排序开始后,每次从“未排序”数据中取出最小的元素(注意这里是最小元素,与“插入排序”不同),然后将最小元素插入到之后“已排序”数据中的最后一个元素(这里,这个最小的元素实际上是与“已排序”数据末尾的下一个元素交换),这样“已排序”数据中的数据始终是有序的。这有一直循环进行,直到所有“未排序”的数据交换完毕,则整个排序完成。下面用图例来说明一下:(图片来源网络)从上图可以看出,初始数组为元素297298138766525136下标012345678这个数组需要待排序从小到大排序,默认初始状态都是无序的,所以开始遍历数组寻找最小的元素。1、在大循环的第一遍中,找到整个数组中最小的元素“13”,将最小的元素“13”与数组开头的元素“29”交换。交换后的数组为:元素137298298766525136下标0123456782。在第二轮大循环中,元素“13”属于“已排序”部分,其余所有元素都属于“未排序”部分。从剩余的元素中找出最小的元素“29”,将这个最小的元素“29”与元素“72”交换(因为元素“72”是排序后数组的下一个元素),交换后的数组为:元素132998728766525136下标0123456783.第三轮大循环中,“已排序”部分已经有元素“13”和“29”,剩下的全部其他元素是“未排序的”。从剩余的元素中找出最小的元素“36”,将最小的元素“36”与元素“98”交换(因为元素“98”是排序后数组的下一个元素),交换后的数组为:元素132936728766525198下标0123456784.第四遍大循环中,已经有元素“13”、“29”、“36”在“已排序”部分,其余元素是“未排序”的。从剩余的元素中找出最小的元素“51”,将这个最小的元素“51”与元素“72”交换(因为元素“72”是排序后数组的下一个元素),交换后的数组为:元素132936518766527298下标0123456785.大循环第五遍,已经有元素“13”,“29”,“36”在“sorted”部分,“51”,其余元素为“未排序”。从剩余的元素中找出最小的元素“52”,将最小的元素“52”与元素“87”交换(因为元素“87”是排序后数组的下一个元素),交换后的数组为:元素132936515266877298下标0123456786.第六轮大循环,已经有元素"13","29","36"在"sorted"部分、“51”、“52”,其余元素“未排序”。从剩余的元素中找到最小的元素“66”,发现这个最小的元素“66”已经是排序后数组的下一个元素,所以不需要交换,数组不变:元素132936515266877298下标0123456787第七轮大循环中,已经有元素“13”、“29”、“36”、“51”、“52”在“已排序”部分,“66”和其余元素是“未排序”的。从剩余的元素中找出最小的元素“72”,将这个最小的元素“72”与元素“87”交换(因为元素“87”是排序后的数组的下一个元素),交换后的数组为:元素132936515266728798下标0123456788.第八轮大循环,已经有元素“13”、“29”、“36”在“已排序”中section,“51”,“52”,“66”,“72”,其余元素“未排序”。从剩余的元素中找到最小的元素“87”,发现这个最小的元素“87”已经是排序后数组的下一个元素,所以不需要交换,数组不变:元素132936515266728798下标0123456789第九轮大循环中已经有元素“13”、“29”、“36”、“51”、“52”在“已排序”部分,“66”,“72”,“87”,剩下唯一未排序的元素是“98”,保持其位置不变即可,即此时全部排序完成,数组的最终状态为:元素132936515266728798下标012345678下标看一段选择排序代码:算法题:将数组arr从小到大排序,假设数组arr不为空,arr的长度为n思路:使用选择排序方法publicvoidselectionSort(int[]arr){inti,j;intn=arr.length;//每次大循环都能找到剩余元素的最小值for(i=0;i
