希尔排序详解
希尔排序也是一种插入排序,它是简单插入排序经过改进之后的更高效的版本。该算法是突破O(n^2)的第一批算法之一。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序。随着增量逐渐减小,每组包含的数字越来越多,当增量减至1时,整个文件恰好被分成一组,算法便终止。
图解希尔排序
我们来看下希尔排序的基本步骤,我们选择增量gap = length/2,缩小增量继续以gap = gap/2 的方式,这种增量选择我们可以用一个序列来表示,{n/2,(n/2)/2...1}的增量序列。
原始数组 以下数据元素颜色相同的为一组【gap:等距离差量值】
初始增量 gap = length/2 = 5,所以整个数组被分为5组,即从第一位置的数字开始向后+n*gap为同一组,所以第一次增量后5组为[8,3],[9,5],[1,4],[7,6],[2,0]
对以上两组再分别进行插入排序,在[3,1,0,9,7]中会变为[0,1,3,7,9], [5,6,8,4,2]会变为[2,4,5,6,8],如下图所示,可以看到整个数组的有序程度更进一步了。
再缩小增来gap=2/2 = 1 ,此时整个数组为1组[0,2,1,4,3,5,7,6,9,8],如下图所示
代码实践
#include <stdio.h> #define N 10 // 分组排序函数 void gapInsertSort(int arr[], int gap); int main() { // 标准的输入输出不需要缓存,直接输出 setbuf(stdout, NULL); int arr[N] = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0}; int gap = N / 2; while(gap >= 1) { gapInsertSort(arr, gap); gap = gap / 2; } printf("数组升序排列:"); for (int i = 0; i < N; ++i) { printf("%d ", arr[i]); } printf("\n"); return 0; } // gap 等距离差量值 void gapInsertSort(int arr[], int gap) { for (int i = gap; i < N; ++i) { // 无序区 int temp = arr[i]; int j = i - gap; while (j >= 0 && arr[j] > temp) { // 有序区:每个有序的分组进行比较,移动,插入 arr[j + gap] = arr[j]; j = j - gap; } arr[j + gap] = temp; } }
运行结果
数组升序排列:0 1 2 3 4 5 6 7 8 9
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器