希尔排序

希尔排序(它是第一个时间复杂度冲破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];
    }
}

 

posted @ 2020-03-31 15:55  whhhd  阅读(155)  评论(0编辑  收藏  举报