Java 基础,这里记录一下。
平时开发中 for
循环使用的非常多,我们都知道 for
循环的顺序如下:
// exp2 为条件表达式
for(exp1;exp2;exp4){
exp3;
}
- 先执行
exp1
,再执行 exp2
,如果返回 true
,则执行 exp3
,最后再执行 exp4
,然后再到 exp2
; - 如果执行
exp2
为 false
,则会跳出循环体;
接下来看一个插入排序的例子,实现方式如下:
package dongguabai.algorithm;
import java.util.stream.Stream;
/**
* @author Dongguabai
* @Description
* @Date 创建于 2021-01-06 16:54
*/
public class SortDemo {
public static void main(String[] args) {
Integer[] arr = {2, 1, 5, 3, 8, 6, 4, 5, 0, 9, 1};
insertSort1(arr);
System.out.println("正确顺序:\n0 1 1 2 3 4 5 5 6 8 9 ");
Stream.of(arr).forEach(a -> System.out.print(a + " "));
System.out.println("\n=============");
Integer[] arr2 = {2, 1, 5, 3, 8, 6, 4, 5, 0, 9, 1};
insertSort2(arr2);
System.out.println("正确顺序:\n0 1 1 2 3 4 5 5 6 8 9 ");
Stream.of(arr2).forEach(a -> System.out.print(a + " "));
}
private static void insertSort1(Integer[] arr) {
for (int i = 1; i < arr.length; i++) {
int t = arr[i];
int j;
for (j = i; j >= 1 && t < arr[j - 1]; j--) {
arr[j] = arr[j - 1];
}
arr[j] = t;
}
}
private static void insertSort2(Integer[] arr) {
for (int i = 1; i < arr.length; i++) {
int t = arr[i];
int j;
for (j = i; j >= 1; j--) {
if (t < arr[j - 1]) {
arr[j] = arr[j - 1];
}
}
arr[j] = t;
}
}
}
输出结果:
正确顺序:
0 1 1 2 3 4 5 5 6 8 9
0 1 1 2 3 4 5 5 6 8 9
=============
正确顺序:
0 1 1 2 3 4 5 5 6 8 9
1 9 5 6 6 8 5 8 8 8 9
会发现 insertSort2
方法的排序是错误的,粗略看 insertSort1
和 insertSort2
方法效果应该是一样的,但是在第二层 for
循环中,insertSort1
方法进入循环体的次数是少于 insertSort2
的,也就是说 insertSort1
方法执行 j--
的次数与 insertSort2
是不一样的,导致两个方法最终赋值会有差异,即排序结果不同。