希尔排序

希尔排序(它是第一个时间复杂度冲破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 @   whhhd  阅读(165)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
点击右上角即可分享
微信分享提示