算法描述:
直接插入排序算法:插入表示将一个新的数据插入到一个已经排好序的有序数表中,并继续保持有序。例如有一个长度为n的无序数组,进行n-1次的插入就能完成排序。第一次,数组第1个数认为是有序的数组,将数组第2个元素插入仅有1个有序的数组中。第2次,数组前两个元素组成有序的数组,将数组第3个元素插入由两个元素构成的有序数组中......。第n-1次,数组前n-1个元素组成有序的数组,将数组的第n个元素插入由n-1个元素构成的有序数组中,则完成了整个插入排序。
代码实现:
1 public class InsertSort { 2 public void insertSort(int[] arr) { 3 if(arr==null || arr.length==1) { 4 return; 5 } 6 int len=arr.length; 7 for(int i=1;i<len;i++) { 8 int j; 9 int temp=arr[i]; 10 for(j=i-1;j>=0 && arr[j]>temp;j--) { 11 arr[j+1]=arr[j]; 12 } 13 arr[j+1]=temp; 14 } 15 } 16 }
直接插入排序算法的时间复杂度分析
插入排序算法的时间复杂度就是比较的次数,而比较的次数与待排数组的初始顺序有关,当待排数组有序(顺序)时,没有移动操作,此时该算法的时间复杂度为O(n)。当待排数组是逆序时,比较次数达到最大(最坏的情况),此时该算法的时间复杂度为O(n2)。
算法的空间复杂度:O(1)
算法的稳定性:直接插入排序算法是稳定的(数组中有相同的元素时,排序后并不替换位置)
直接插入排序算法比冒泡和简单选择排序算法的性能要好一些