- 马上要实习面试了,总结和分析一下算法与数据结构。
插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。
如果已经是顺序,那么每次只需要和前面一个数进行比较,最好的时间复杂度是O(n)。
如果完全反序,那么共需要1+2+…+n-1次比较,最差的时间复杂度是O(n²)
public static void InsertSort(int[]arr){
int length = arr.length;//数组长度
int val;//用于存储需要插入的值
//第一个不动,从第二个数开始向前插
for(int i = 1;i<length; i++){
val = arr[i];
int j;//后面需要用到j
for (j = i-1 ; j>=0 ;j--){
//如果前面的数比val大,就把前面的数后退
if(arr[j] > val){
arr[j+1] = arr[j];
}else{
//如果找到比val小的,那么val肯定在他后一个位置,直接退出
break;
}
}
//两种情况,找到比val小的arr[j]那么val就在arr[j+1]
//如果没找到,那么val是最小的,此时j=-1,就在arr[j+1]
arr[j+1] = val;
}
}