插入排序的算法是通过构建有序序列,对于未排序的数据,在已经排序中从后向前查找操作,找到满足条件的元素之后进行位置插入操作
时间复杂度:最优O(n)平均:O(n^2)
空间复杂度:O(1)
稳定性:稳定
//插入排序 public static <T extends Comparable<T>>void insertSort(T[] arr){ if(arr==null||arr.length==0){ return; } //先找位置 for(int i = 0;i<arr.length-1;i++){ int minIndex = i; for(int j =i+1;j<arr.length;j++){ if(arr[j].compareTo(arr[minIndex])<0){ minIndex=j; } } T temp = arr[minIndex]; //移动数据 int z; for(z=minIndex;z>i;z--){ arr[z]=arr[z-1]; } arr[z] = temp; } }
一种插入排序,它是简单插入排序的一种算法改进方式,也成为见效增量排序,希尔排序的时间复杂度相比直接插入排序的时间复杂度要小,它与直接插入不同在于,他会优先比较距离较远的元素,希尔排序是按照一定的增量进行分组排序,对每一组进行直接插入排序,随着分组个数的减小,每组中元素就会越来越多,当增量为1,排序结束
选择增量gap=length/2;缩小增量继续以gap=gap/2的方式进行分组
间隔式分组:5组、3组、1组
1.
2.
3.
平均时间复杂度:O(n^1.3 到
n^1.5)
空间复杂度:O(1)
稳定性:不稳定
//希尔排序 public static <T extends Comparable<T>>void shellSort(T[] arr,int gap){ int i = 0,j=0; for(j=gap;i<arr.length;i++){ T temp = arr[i]; for(j=i-gap;j>=0;j-=gap){ if(temp.compareTo(arr[j])<0){ arr[j+gap] = arr[j]; } else{ break; } } arr[j+gap]=temp; } } public static <T extends Comparable<T>>void shell(T[] arr){ int[] partition={5,3,1}; for(int i = 0;i<partition.length;i++){ shellSort(arr,partition[i]); } }
今天也要好好学习呀~