希尔排序
希尔排序(它是第一个时间复杂度冲破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]; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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爆火,是硬核还是营销?