深刻理解选择排序
选择排序法基本思想:第1趟,在待排序记录r[1]~r[n]中选出最小的记录,将它与r[1]交换;第2趟,在待排序记录r[2]~r[n]中选出最小的记录,将它与r[2]交换;以此类推,第i趟在待排序记录r[i]~r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕
给定一组数据int[] nums ={21, 14, 17, 12, 5, 10}用选择排序的思维,进行如图分析
根据上面所述进行代码实现:
<span style="font-size:14px;">//外层for循环执行一次,有一个数回归正确位置,所以只需比较length-1次
for (int i = 0; i < nums.length - 1; i++) {
int m = i;
//内层for循环执行结束,即可找出最小数的角标
for (int j = i + 1; j < nums.length; j++) {
if (nums[j] < nums[m]){
m = j;//使用m记录一个选择回合中的最小值的位置
}
}
//通过m与i值的比较,做出是否进行交换的选择
if (m != i){
int temp = 0;
temp =nums[m];
nums[m] = nums[i];
nums[i] = temp;
}
}
</span>
现在来反观程序:外层for循环内部有三个基本操作:1.将当前数的位置赋值给中间变量。2.确定本次选择中最小数的位置3.通过最小数位置的和当前数的位置的比较,进行数的交换。这三个步骤执行n-1次,然后排序完成。
现在来看,是不是思路很清晰,但是当我们开始遇见这个问题时,看了它的基本思想后,我们能从中抽取出这样清晰的基本思路吗?然后设计出程序吗?
每一个程序,既有差异,又有共性,将他们的思想抽象成程序的步骤,这是我们需要锻炼的一种能力。