小白懂算法之希尔排序
一.希尔排序介绍
希尔排序是属于插入排序的一种,是直接插入排序算法的一种优化
二.算法原理
希尔排序是根据步长step进行分组(比如说[1,2,3,4,5,6,7,8],步长为2,则[1,3,5,7]为一组,[2,4,6,8]为一组,不要理解成[1,2,3,4]为一组,不然下面的代码你会搞混的),然后对分组后的序列进行插入排序,插入排序的进行是在同一组内进行的。当本次step分组排序完毕,进行下一轮step分组直至step =1为止,即整个数据合成一组,构成一组有序记录,完成排序;
三.图解
四.代码实现(Java实现)
private static void shellSort(int[] arr) { /** * 实现思路: * 1.定义步长,逐渐缩小步长的长度,直到0为止 * 2.使用三重循环: * >第一重循环控制的是每轮步长的不同 * >第二重循环控制的是当前节点,即和前面元素比较的值 * >第三重循环控制的是在同一组内当前节点与前面的元素进行插入排序 */ for(int step=arr.length/2;step>0;step/=2) { //控制每一大轮步长,比如初始步长为4,下轮步长为2,只要步长>0即可进行 for(int i=step;i<arr.length;i++) { //这一层控制的当前节点,当前节点是需要和前面的元素逐一比较的,也就是插入法 int temp = arr[i]; //将当前的节点保存起来 int j; //这个j是临时保存同一组内当前节点前面的元素,这里说的组是根据步长划分出来的,举个数组[1,2,3,4],步长为2,则1,3为一组,2,4为一组 for(j=i-step;j>=0 && arr[j]>temp;j-=step) { //当前节点和同一组前面的元素进行比较 arr[j + step] = arr[j]; //元素后移动step位 } arr[j + step] = temp; //在同一组内,插入到当前节点前面的某个元素后的step位 } } }
强调:
》上面的gif图片是我从其他博客拿过来的,只是为了方便大家理解,但我告诉大家,在上面的代码实现,实际的执行过程不是图解的那样;在第二重循环中,i 记录的是当前的节点,从step开始,即从第二个区间首个元素开始作为当前节点,i++也意味着第二个区间首个元素及后面的全部元素都会作为当前节点,每轮遍历都是换组的,你要记住这点。
》里面的两层循环其实就是插入排序,只不过从之前的相邻元素变成相邻step位而已。
资料参考:
https://www.cnblogs.com/luomeng/p/10592830.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~