过程: 插入算法的核心思想是取未排序区间中的元素,在已排序区间中找到合适的插入位置将其插入,并保证已排序区间数据一直有序。重复这个过程,直到未排序区间中元素为空,算法结束。
示意图:

第一,插入排序是原地排序算法吗?
从实现过程可以很明显地看出,插入排序算法的运行并不需要额外的存储空间,所以空间复杂度是O(1),也就是说,这是一个原地排序算法。
第二,插入排序是稳定的排序算法吗?
在插入排序中,对于值相同的元素,我们可以选择将后面出现的元素,插入到前面出现元素的后面,这样就可以保持原有的前后顺序不变,所以插入排序是稳定的排序算法。
第三,插入排序的时间复杂度是多少?
如果要排序的数据已经是有序的,我们并不需要搬移任何数据。如果我们从尾到头在有序数据组里面查找插入位置,每次只需要比较一个数据就能确定插入的位置。所以这种情况下,最好是时间复杂度为O(n)。注意,这里是从尾到头遍历已经有序的数据。如果数组是倒序的,每次插入都相当于在数组的第一个位置插入新的数据,所以需要移动大量的数据,所以最坏情况时间复杂度为O(n2)。
import java.util.Arrays;
public class Main {
public static void insertSort(int[] arr) {
for(int i = 1;i < arr.length;i++) {
int value = arr[i];//未排序区间的首元素
int j = i - 1;//已排序区间的尾下标
for(;j >= 0;j--) {
if(value < arr[j]) {
arr[j + 1] = arr[j];//如果value小,arr[j]就向后移一位
}else {
break;
}
}
arr[j + 1] = value;
}
}
public static void main(String[] args) {
int[] arr = {1,3,2,6,4,0,8,5,9,7};
insertSort(arr);
System.out.println(Arrays.toString(arr));
}
}
791

被折叠的 条评论
为什么被折叠?



