public void insertSort1(int[] a){
// 遍历除了第一个元素外的所有元素,
// 即将初始无序区内的元素一一插入有序区
for (int i = 1; i < a.length; i++){
// 存放插入元素,即有序区的下一个
int temp = a[i];
// 定义j变量,并初始化,j变量用于插入位置的定位
int j = 0;
// 搜寻插入位置
for (j = i - 1; j >= 0; j--){
// 从有序区最后一个元素开始比较,若比较的元素比
// 插入的元素大则比较的元素往右移一位
// if (temp < a[j])
if (a[j] >= temp)
a[j + 1] = a[j];
// 若比较的元素比插入元素小,结束比较
// 因为是有序区(最大的都比其小,所以其前面的会比其小),
// 所以没有必要再比下去,直接跳出
// if(temp > a[j])
if (a[j] < temp)
break;
}
// 将插入元素插入到搜寻到的合适位置
a[j + 1] = temp;
// 查看每一步插入的情况
System.out.println(Arrays.toString(a));
}
}
public void insertSort2(int[] arr){
for (int i=1; i<arr.length;i++){
if (arr[i] < arr[i-1]){
int temp = arr[i];
int j;
for (j= i-1;j>=0;j--){
if (arr[j] >= temp)
arr[j+1] = arr[j];
else
break;
}
arr[j+1] = temp;
}
}
}
最好的情况 比较 + 移动 (也就是要排序的表本身就是有序的)
n-1 0 -> O(n)
最坏 n^2 n^2 -> O(n^2) (也就是逆序)
如果排序记录是随机的,
平均比较与移动次数约为n^2/4
所以得出直接插入排序的时间复杂度为O(n^2)
同样是O(n^2) 时间复杂度,直接插入排序比冒泡排序和简单选择排序的性能要好一些。