错误版本
private static void sort(int[] array) {
for(int i = 1; i < array.length; i++) {
int temp = array[i];
int j;
for(j = i -1 ; j >= 0; j--) {
if(array[j] > temp) {
// 1步
array[j + 1] = array[j];
} else {
// 2步
array[j + 1] = temp;
break;
}
}
}
}
该代码存在错误,比如初始排序数组为(4,-1,2,3,4)
- 第1步,如果判断了array[j+ 1]的数大于了temp(值为-1),此时要将array[j + 1]向右移动,即arr[j + 1] = array[j]。此时数组为(4,4,2,3,4)
- 下一次循环,不满足条件退出循环,但是,第2步是放在else里面的,不会执行,造成数据错误
正确版本
private static void sort(int[] array) {
// i从1开始遍历,因为0这个位置左边并没有数据,无需再向左边插入
for(int i = 1; i < array.length; i++) {
int temp = array[i];
int j;
for(j = i -1 ; j >= 0; j--) {
if(array[j] > temp) {
array[j + 1] = array[j];
} else {
break;
}
}
// 放这里
array[j + 1] = temp;
}
}
稳定性
每次插入元素时总是从后向前先比较再移动,所以不会出现相同元素相对位置发生变化的情况。即直接插入排序是一个稳定的排序方法。