老师很莫名其妙的叫我来讲这个排序,那只能重新回去看了下。
直接插入排序是由两层嵌套循环构成的,一个是当前的,一个是要跟前面比较的。
直接插入排序应该是从右到左的排序方式,也就是 0 1第一次判断,然后 0 1 2 第二次判断, 0 1 2 3 第三次判断...直到n,当然都是从右边数开始。
然后对于直接插入排序,最好的情况是整个数组是递增排序,那么无需移动元素,只需要对比n-1次
而最坏的情况则是递减数组,移动和对比元素都是n(n-1)/次
然后直接插入排序的时间0复杂度是O(n^2) 空间复杂度是O(1)
public static void main(String[] args) {
int arr[]={2,1,5,3,6,4,9,8,7};
int k=0;
for(int i=1;i<arr.length;i++)
{
k=arr[i]; //存储当前这个值
for(int j=i;j>=0;j--)
{
if(j>0&&arr[j-1]>k) //先判断j是否大于0,因为j要是不大于0,j-1会越界,因为j=i,所以j-1就是i的前一个值,然后判断大小,如果是大于i,那么把值赋予给i
{
arr[j]=arr[j-1];
}else{ //这个代码用来把i的值赋给j-1,因为如果上面的代码执行过的话,那么此时的j已经减去过了,虽然不知道到底减到了几,但是一定是在比前一个数大,比后 一 个数小的位置
arr[j]=k;
break;
}
}
}
System.out.println(Arrays.toString(arr));