news 2026/5/11 9:30:36

计算机学习笔记——希尔插入排序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
计算机学习笔记——希尔插入排序

目录

1.前言

2.直接插入排序

3.希尔插入排序

题目描述

输入输出样例

样例输入 #1

样例输出 #1

希尔排序的增量选择会对算法时间复杂度产生很大影响,上面的增量序列采用的是原始Shell增量序列,适用于数据量较少的情况。下面给出常用的增量公式Hibbard 序列

4.感言


1.前言

最近学习比较繁忙,一直没有抽出时间整理,难得有一个比较清闲的周末,专门写一篇笔记来整理一下排序方法,这里主要讲插入排序。算法思想是将待排序的序列分为已排序和未排序两部分,每次从未排序部分取出一个元素,在已排序部分中找到合适的位置插入,使已排序部分始终保持有序。

2.直接插入排序

大家一开始接触的排序除了冒泡排序与选择排序外,就是插入排序了。这算是时间复杂度为O(n^2)的排序中平均情况下比较快的排序了,在比较元素后可能正好是最大值,直接插入到原排序中,也就省去了移动过程。

#include<bits/stdc++.h> using namespace std; const int N=1e7; int arr[N]; int main(int argc, char** argv) { int n; cin>>n; if(n<=1) { cout<<"无需排序"<<endl; return 0; } for(int i=0;i<n;i++) cin>>arr[i]; for(int i=1;i<n;i++){ int k=arr[i]; //相当于拿出一个元素 ,这样就腾出了一个空位置,即arr[n] int j=i-1; //双指针,i指向当前空位置 ,j指向前序列元素 的位置 while(j>=0&&arr[j]>k){ //采用移动元素,而不是每次比较做交换 arr[j+1]=arr[j]; j--; } //最终j停留在arr[j]<=k的位置 ,arr[j+1]可以看做一个空位置 arr[j+1]=k; } for(int i=0;i<n;i++){ cout<<arr[i]<<" "; } cout<<endl; return 0; }

3.希尔插入排序

这是上世纪50年代唐纳德·L·希尔(Donald L. Shell)的算法,这也是计算机历史上的第一个突破时间复杂度O(n^2)的算法,达到了约O(n^1.3)。(具体时间复杂度目前算不清)

简单来说,核心思想是通过设定某增量序列,将大序列分成小序列,插入排序每个小序列,再不断缩小增量,继续进行插入排序,逐渐提高序列的有序性,最终实现整个序列的排序。具体来说,通过设定增量为p,我们就可以将序列分为p组,这些组的序列分别满足{x1}%p==0,{x2}%p==1……{xp}%p==p-1。不难发现,当p=1时,就是直接插入排序。

题目描述

给你10个数,设计一个程序,实现希尔插入排序算法,并输出这个序列的希尔排序过程。

输入

1行10个数,两个数之间有空格隔开,所有数均不超过10^9

输出

每个排序过程输出一行,直到排序完成。

输入输出样例

样例输入 #1
9 8 7 6 5 4 3 2 1 0
样例输出 #1
4 3 2 1 0 9 8 7 6 5 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9

代码如下

#include <bits/stdc++.h> using namespace std; int main(){ int n=10; int arr[n]; for(int i=0;i<n;i++) cin>>arr[i]; int gap; for(gap=n/2;gap>0;gap/=2){ for(int i=gap;i<n;i++){ int k=arr[i]; int j=i; while(j>=gap&&arr[j-gap]>k){ arr[j]=arr[j-gap]; j-=gap; } arr[j]=k; } for(int i=0;i<n;i++) cout<<arr[i]<<" "; cout<<endl; } return 0; }

补充

希尔排序的增量选择会对算法时间复杂度产生很大影响,上面的增量序列采用的是原始Shell增量序列,适用于数据量较少的情况。下面给出常用的增量公式Hibbard 序列

Hibbard 序列是希尔排序中一种经典的增量序列。它通过公式生成,其中 kk为正整数,增量值依次为:

1,3,7,15,31,63,127,255,511,1023……

使用时通常取小于数组长度 n的最大值作为初始增量,然后按递减顺序取完所有值,最后以 1 结束

4.感言

都说学算法是重复造轮子,但我觉得更重要是学会用轮子。站在前人的肩膀上,虽然我是当下的菜鸡,但在百年前未必不是算法大佬(狗头)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/11 9:30:19

3分钟打造你的专属桌面伙伴:DyberPet终极低代码指南

3分钟打造你的专属桌面伙伴&#xff1a;DyberPet终极低代码指南 【免费下载链接】DyberPet Desktop Cyber Pet Framework based on PySide6 项目地址: https://gitcode.com/GitHub_Trending/dy/DyberPet 你是否厌倦了冰冷的桌面图标和单调的工作界面&#xff1f;想象一下…

作者头像 李华
网站建设 2026/5/11 9:28:35

如何评估AI Agent的投资回报率

AI Agent ROI计算完全指南:从投入测算到价值量化,每一分钱都花得明明白白 关键词 AI Agent投资回报率、ROI量化模型、Agent投入产出测算、智能体全生命周期成本核算、AI商业价值评估、Agent落地效益分析、LLM智能体投资决策 摘要 2024年被称为AI Agent规模化落地元年,全…

作者头像 李华
网站建设 2026/5/11 9:21:34

终极指南:使用XUnity.AutoTranslator打破Unity游戏语言壁垒

终极指南&#xff1a;使用XUnity.AutoTranslator打破Unity游戏语言壁垒 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 你是否曾因语言障碍而错过心仪的外语游戏&#xff1f;XUnity.AutoTranslator正是为…

作者头像 李华
网站建设 2026/5/11 9:15:25

服了,程序员就不配谈女朋友?

大家好&#xff0c;这里是TonyBai。最近收到一个粉丝的长留言&#xff0c;看完挺不是滋味。一个在上海做后端的粉丝&#xff0c;硕士毕业五年&#xff0c;收入水平绝对在线&#xff0c;性格也很好。但就因为没有渠道认识异性&#xff0c;30了还单着。"不是不想谈&#xff…

作者头像 李华
网站建设 2026/5/11 9:14:32

无标实时动态重构 全域智慧孪生:毫秒级空间解算能力,支撑视频孪生态势推演与主动预警

实时动态重构 全域智慧孪生副标题&#xff1a;毫秒级空间解算能力&#xff0c;支撑视频孪生态势推演与主动预警前言传统数字孪生普遍存在场景更新滞后、空间刷新迟缓、态势同步延迟、只能事后回看无法事前预判等短板。大多依赖静态模型定期更新&#xff0c;空间解算耗时久、响应…

作者头像 李华
网站建设 2026/5/11 9:12:05

AI项目规则生成器:基于LLM的智能脚手架与工程化配置实践

1. 项目概述&#xff1a;一个能帮你“立规矩”的AI项目生成器 最近在GitHub上看到一个挺有意思的项目&#xff0c;叫 naravid19/ai-project-rules-generator 。光看名字&#xff0c;你可能会觉得这又是一个“AI生成代码”的工具&#xff0c;但实际玩下来&#xff0c;我发现它…

作者头像 李华