原理:
就是讲待排序数组分为两部分,第一部分看为有序数组(初始时只有一个数),一次处理无序的数组(无序的第一个数为他在有序的部分中找到一个合适的位置插入,前面的数依旧有序,直到无序的数处理完)
图示:
代码实现
public class InsertSort {
public void sort(int[] arr,int n){
int i,j,k;
for(i=1;i<n;i++){
//这个循环只是用来找到位置,不做其他处理
for(j=i-1;j>=0;j--){
if(arr[j]<=arr[i])
break;
}
//也就是说已排好的数组最后一位值比它小,就没有必要挪动位置
if(j==i-1)continue;
int temp = arr[i];
//将所有比它大的数都向后移动一位,留出一个位置插入
for( k =i-1;k>j;k--){
arr[k+1]=arr[k];
}
arr[k+1]=temp;
}
}
public static void main(String[] args) {
int[] arr = new int[]{20,40,30,10,60,50};
new InsertSort().sort(arr,6);
System.out.println(Arrays.toString(arr));
}
}
时间复杂度
直接插入排序的时间复杂度是O(N2)。
假设被排序的数列中有N个数。遍历一趟的时间复杂度是O(N),需要遍历多少次呢?N-1!因此,直接插入排序的时间复杂度是O(N2)。
依旧是稳定的算法。