希尔排序(它是第一个时间复杂度冲破o(n^2)的)
它是以插入排序为基础建立的,
它的工作原理为:使用增量对序列进行分组进行插入排序,希尔建议的增量(希尔增量):{n/2,(n/2)/2......1},但不是最优的
比如一个序列的长度为10,也就是一开始分为5组,然后2组,直到分为1组时.
它的时间复杂度无论什么时候都为o(nlog2n)
package sort; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; /** * @author wyc * 希尔排序 * 此希尔排序是为了熟悉数组的操作,所以增加了数组的拆分和合并操作以及class反射调用私有方法 * 优化的希尔排序是可以在当前数组进行插入排序,参考原插入排序,控制希尔变量即可 * 它的时间复杂度最优为o(nlog2n),这个不稳定,得参考希尔增量 */ @SuppressWarnings("unused") public class ShellSort { public static void main(String[] args) throws Exception { int[] arrays = {1,11,12,4,2,6,9,0,3,7,8,2}; /*System.out.println("main方法的地址:"+arrays.toString());*/ sort(arrays,2); //传入要排序的数组以及希尔增量 for(int value : arrays){ System.out.print(value+","); } System.out.print(" "+arrays.length); }
public static void sort(int []arr,int n){
//增量gap,并逐步缩小增量
for(int gap=arr.length/n;gap>0;gap/=n){
//从第gap个元素,逐个对其所在组进行直接插入排序操作如果gap为3,则分组为(0,3,6,9)(1,4,7,10)(2,5,8,11)
for(int i= gap;i<arr.length;i++){
int j = i;
while(j-gap>=0 && arr[j]<arr[j-gap]){ //对其所在组进行插入排序
//插入排序采用交换法
swap(arr,j,j-gap);
j-=gap;
}
}
}
}
private static void swap(int[] arrays,int index,int index1){ arrays[index] = arrays[index] + arrays[index1]; arrays[index1] = arrays[index] - arrays[index1]; arrays[index] = arrays[index] - arrays[index1]; } }