正文
每次都将当前元素插入到左侧已经排序的数组中,使得插入之后左侧数组依然有序。
插入排序的时间复杂度取决于数组的初始顺序,如果数组已经部分有序了,那么逆序较少,需要的交换次数也就较少,时间复杂度较低。
public class Insertion<T extends Comparable<T>> extends Sort<T>{
@Override
public void sort(T[] nums) {
int Len = nums.length;//数组长度
for(int i = 1; i < Len ; i ++) {//遍历数组,i要从1开始
//因为我们要判断下标为j-1和j的大小
for(int j = i; j > 0 && less(nums[j], nums[j - 1]);j --){//保证左侧的值有序
swap(nums, j, j - 1);//逆序则交换
}
}
}
}
复杂度
最好的情况下需要 N-1 次比较和 0 次交换,最好的情况就是数组已经有序了
最坏的情况下需要 ~N2/2 比较以及 ~N2/2 次交换,最坏的情况是数组是倒序的;
时间复杂度:平均O(n²)
最好O(n) 顺序
最坏O(n²) 逆序
空间复杂度:O(1)
稳定性:稳定
PS:我刚开始看实现的时候在想,没有插入啊,为啥叫插入语句啊,细想之后明白了,我们可以吧左侧已经排好序的部分看做一个数组,后面来一个就相当于是插入一个。
小知识:
稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。