简单来说:每一个元素,与之前的所有元素比较,对之前元素进行向后平移,直到找到比当前元素小的,将当前元素插入
public class InsertSort {
public static void display(List<Integer> array){
for(int i=0;i<array.size();i++){
System.out.print(array.get(i)+" ");
}
System.out.println();
}
public static void sort(List<Integer> array){
for(int i=1;i<array.size();i++){
int tmp = array.get(i);
int minIndex = i;
for(int j=i-1;j>=0;j--){
if(tmp<array.get(j)){
array.set(j+1,array.get(j));
minIndex = j;
}
}
if(minIndex!=i){
array.set(minIndex,tmp);
}
}
}
public static void main(String[] args){
List<Integer> array = new ArrayList<Integer>(Arrays.asList(77,99,44,55,22,88,11,0,66,33));
display(array);
sort(array);
display(array);
}
}
时间复杂度仍然是o(N^2)但一般情况下,比冒泡排序快一倍,比选择排序还要快一点。
对于基本有序或已经有序的数据来说,第二层基本可以忽略,几乎只需要o(N)的时间
对于逆序的数据,插入排序不比冒泡排序快