选择排序
代码如下:
int[] arr = {9, 7, 5, 3, 1};
loop1: for(int i = 0; i < arr.length - 1; i++){//从0开始没错,为什么终止条件要arr.length - 1
int minIndex = 0;
loop2: for(int j = i + 1; j < arr.length; j++){//从i + 1开始也没问题,为什么终止条件变成arr.length
if (arr[minIndex] > arr[j]){
minIndex = j;//如果已获得的最小值下标,比下一个元素大,则把下一个元素的下标,赋予最小值下标
}
}
//内层循环结束之后,获得最小值与第i个元素交换位置
int temp = arr[minIndex];
arr[minIndex] = arr[i];
arr[i] = temp;
}
第一个疑问:外层循环 loop1 的终止条件为什么是 arr.length - 1 ?
1、首先最后一个元素的下标为 arr.length - 1,正常遍历所有元素,写 i < arr.length没错,相当于 i <= arr.length - 1,从 0 到 arr.length - 1,循环次数为 arr.length,5次
2、然后作为排序,外层循环是控制比较次数。第一轮是两两相比,找当前循环里最小的值。
两相比较的话,比较次数(比如两个人比较一次,三个人比较两次)总是比元素个数少1,相当于循环到倒数第二个元素,它的下标是,arr.length - 1 - 1
3、所以终止条件应该是 i <= arr.length - 1 - 1,相当于 i < arr.length - 1
然后找到每轮的最小元素,与每轮比较的第一个元素,交换位置
内层循环 loop2 的结束条件为什么是 arr.length ?
1、首先内层循环是控制比较的元素长度
j 从 每次外层循环开始的第二个元素开始,和第一个比较。每轮外层循环开始的第一个元素是arr[i],即下标为i,所以 j 理应从 i + 1 开始
2、然后每次循环都是遍历到最后一个元素为止,下标遍历到 arr.length - 1 结束。即 j 的最大值最终为 arr.length - 1,结束条件时 j <= arr.length - 1,相当于 j < arr.length。
换一种思路:
外层循环控制的是第一个元素,从0位开始,与后一个元素比较大小,后一个元素由内层循环控制;
即是两两比较,外层循环的下标最大值,只能为倒数第二个元素的下标,就是 arr.length - 1 - 1;
内层循环的最大值,是最后一个元素的下标,就是 arr.length - 1
只要找到规律,循环的起始条件和结束条件,是比较容易找到的