插入排序就是把一个未排序的数组看成两部分,一部分认为是有序的,另一部分认为是无序的,最开始的时候有序数组只有开头的第一个元素,剩下的都是无序的,要做的就是每次从无序数组中拿出一个去找到其在有序数组中应该待的位置,这样一共需要length-1次才能完成,每一次循环拿出来的那一个元素要么从0索引开始比较,比较到一个大于他的元素为止,但是索引不能超过i-1,要么就从i-1位置开始比较,比较到一个小于他的元素位置,索引最多>=0,对于前一种情况,index所在的位置就是被拿出的那个元素该待的位置,后面的都要后移,对于后一种来说,index所在位置的下一个位置才是他该待的位置;在后移的时候既可以先找到index,再进行后移,也可以找到一个大于arr[i]的就将其后移,不过这种情况只能是从后向前找;
平均时间复杂度是(n²),在最好情况下也就是已经按照规定顺序排列好的话,因为arr[i]>arr[i-1]所以就不会进入遍历,因此时间复杂度为(n),最坏情况下复杂度就是(n²);
代码如下:
//从后往前,只要temp小就将index位置元素后移,注意此时arr[i]处的元素变了,因此使用temp
static void insertSort3(int[] arr) {
int length = arr.length;
for (int i = 1; i < length; i++) {
int index = i - 1;
int temp = arr[i];
while (index >= 0 && temp < arr[index]) {
arr[index + 1] = arr[index];
index--;
}
arr[index + 1] = temp;
}
}