zoukankan      html  css  js  c++  java
  • 希尔排序

    希尔排序(它是第一个时间复杂度冲破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];
        }
    }
  • 相关阅读:
    管理原则与设计原则
    UI事件与内容,舞台与演员
    知识的分类
    我们头脑中的信息是用来帮助判断和选择的
    管理过程实质是信息过程
    20155201 2016-2017-2 《Java程序设计》第八周学习总结
    20155201 2016-2017-2 《Java程序设计》第七周学习总结
    20155201 2016-2017-2 《Java程序设计》第六周学习总结
    20155201 2016-2017-2 《Java程序设计》第五周学习总结
    20155201 2016-2017-2 《Java程序设计》第四周学习总结
  • 原文地址:https://www.cnblogs.com/nyhhd/p/12605759.html
Copyright © 2011-2022 走看看