不同于冒泡排序和选择排序的时间复杂度和数据状况无关(因为每个数都要进行比对或者交换),插入排序的时间复杂度是和数据状况有关系的,这个先有一个概念,后面会详细介绍
下面我们来看代码:
public class InsertSort {
public static void main(String[] args) {
int[] arr = {0,3,6,2,4,9,8,7,1};
insertSort(arr);
for(int a : arr){
System.out.print(a+" ");
}
}
public static void insertSort(int[] arr){
if(arr == null || arr.length < 2){
return;
}
for(int i=1;i<arr.length;i++){//当前的数,要和之前有序区比对插入
for(int j=i-1;j>=0&&arr[j]>arr[j+1];j--){//j位置和j+1位置上的数进行比较相当于i-1和i上面的数进行比较
swap(arr,j,j+1);
}
}
}
private static void swap(int[] arr,int i,int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
这个代码还是外层循环控制起始位置也就是当前需要开始比较的位置,内存循环依靠边界和两侧数的大小来进行控制循环,每次条件成立,则进行交换,但是一旦一个条件不成立则跳出循环,内层循环直接结束。
为什么说插入排序的时间复杂度和数据状况有关系,来看下面:
现在有一组数据:0 1 2 3 4 5 6
根据插入排序规则,第二个数和第一个数相比(1和0),大于,跳出循环;第三个数和第二个数比较(2和1),大于,跳出循环......按照这样的方式,时间复杂度就是比较这一下,1+1+1+1+...=n-1,时间复杂度是O(n)。
现在又有一组数据:6 5 4 3 2 1 0
根据插入排序的规则,第二个数和第一个数相比(5和6),小于,交换,继续,位置到开头,跳出循环;
此时数据:5 6 4 3 2 1 0
第三个数和第二个数相比(4和6),小于,交换==>(5 4 6 3 2 1 0)继续,第二个数和第一个数比较(4和5),小于,交换==>(4 5 6 3 2 1 0),继续,位置到开头,跳出循环。
此时数据: 4 5 6 3 2 1 0
继续比较...........
则第一个数1+2+3+...+n-1=n²+n+1(大概是这样一个表达式),所以时间复杂度是O(n²)。
网友评论