#include "stdio.h"
#include "string.h"
#define MAX_LIST 50
typedef struct _SqList {
int data[MAX_LIST];
int length;
}SqList;
void swap( SqList* L, unsigned index1, unsigned index2 )
{
if( index1 >= L->length || index2 >= L->length ) return;
if( index1 == index2 ) return;
L->data[index1] = L->data[index1] ^ L->data[index2];
L->data[index2] = L->data[index1] ^ L->data[index2];
L->data[index1] = L->data[index1] ^ L->data[index2];
}
enum SHELL_SORT_METHOD { COMPLETE, BREAKDOWN };
//the complete Shell sort implementation
//all in a do {} while loop
//The rationale behind the hood is to achieve roughly sorted array
//in early rounds with a larger increment, and gradually move to
//fine granularity(eventually increment == 1 and fall back to insert sort)
//The insert sort ensures the array is sort complete
//the coarse sorting ensures less element shifting in following iterations
void ShellSortComplete( SqList* L, int divisor )
{
//make sure divisor > 2
if( divisor <= 2 )
{
printf("Make sure divisor > 2, current value %d\n", divisor );
return;
}
int increment = L->length;
int i,j, temp;
do{
increment = increment/divisor + 1;
for( i = increment + 1; i < L->length; i++ )
{
temp = L->data[i];
for( j = i - increment; j > -1 && L->data[j] > temp; j -= increment )
L->data[j+increment] = L->data[j];
if( j + increment != i ) L->data[j+increment] = temp;
}
}while( increment > 1 );
}
//This is a breakdown of the complete implementation
//Single out the last iteration of do{} while loop which is when increment == 1
//when increment == 1, the logic is identical to the insert sort
void ShellSortBreakdown( SqList* L, int divisor )
{
//make sure divisor > 2
if( divisor <= 2 )
{
printf("Make sure divisor > 2, current value %d\n", divisor );
return;
}
int increment = L->length/divisor + 1;
int i,j, temp;
//if increment == 1, the while loop is omitted and Shell sort falls back to insert sort
while( increment > 1 )
{
for( i = increment + 1; i < L->length; i++ )
{
temp = L->data[i];
for( j = i - increment; j > -1 && L->data[j] > temp; j -= increment )
L->data[j+increment] = L->data[j];
if( j + increment != i ) L->data[j+increment] = temp;
}
increment = increment/divisor + 1;
}
//now increment == 1
//you will be surprising to see this portion is identical to insert sort
for( i = 1; i < L->length; i++ )
{
temp = L->data[i];
for( j = i - 1; j > -1 && L->data[j] > temp; j-- )
L->data[j+1] = L->data[j];
L->data[j+1] = temp;
}
}
void ShellSort( SqList* L, int divisor, SHELL_SORT_METHOD ss )
{
if( ss == COMPLETE )
{
ShellSortComplete( L, divisor );
}
else
{
ShellSortBreakdown( L, divisor );
}
}
int main()
{
SqList d;
int intarr[] = {1,10,23,48,65,31,-21,9,88,100};
memcpy( d.data, intarr, sizeof(intarr));
d.length = sizeof(intarr)/sizeof(int);
int index = 0;
printf("Original array:\n");
for( ; index < d.length; index++ )
printf(" %d", d.data[index] );
printf("\nShell sort...\n");
ShellSort( &d, 3, BREAKDOWN );
for( index = 0; index < d.length; index++ )
printf(" %d", d.data[index] );
printf("\n");
return 0;
}
相关推荐
Aspose Java 25.10 版本深度破解:基于字节码修改的实战指南
本文提供了Aspose Java 25.10版本基于字节码修改的实战指南。详细介绍了如何通过Javassist工具逆向分析并修改Aspose Cells、Words、Slides及PDF组件的许可证验证逻辑,从而实现绕过限制,并完成最终的打包与功能验证。
ShellSort实例
希尔排序,是对插入排序的优化,是一种不稳定的排序方法,时间复杂度O(nlogn) 最差为O(n^s) 1 实现步骤: (1)设置增量d为排序数组长度的一半 (2)按增量对数据进行比较,满足条件则交换位置 (3)缩小增量为上一次的一半重复(2),直至增量缩小为1 图示: java 实现: public static void shellsort(int[] list
STRING数据库的蛋白质相互作用(PPI)网络分析
在转录调控相关的文献中,我们经常能够看到这样的蛋白质相互作用网络(protein protein interaction network,PPI network)。具体而言,这些相关的文献中首先通过RNA-seq、表达谱芯片或者蛋白质组分析等,找到了在不同分组样本间一系列的差异表达基因或蛋白。
希尔排序(shell sort)
希尔排序,插入排序的一种变体。算法复杂度: 最好情况:O(n);平均:O(n^1.5);最坏:O(n^1.5或n^2)。 算法简介 回顾插入排序,元素朝着其正确位置一次一个位置的交换swap过去的(插入排序是从右向左比较哦),一个元素离其正确位置越远,其要移动的次数就越多,开销自然也就越大了。一个数组越接近有序,交换操作就越少,算法也就执行得越快。理想情况,当一个数组已经排序好了,那么插入算
VS2019+CAXACAD2023二次开发教程(一、环境搭建)
CAXACAD2023的二次开发相关文件和库都在的文件夹下。CAXACAD2023的默认开发环境是VS2019,如果是用VS2019的环境话,可以直接安装这个插件,安装好后就可以一键新建的项目,新建的项目会自动帮我们配置好所有的环境,并且生成必要的代码和初始的框架。(本来想用VS2022的,但配置环境太麻烦,用VS2022,增加一个环境变量是可以运行自带的例程的,但新建项目要配置的东西和环境太多,就放弃折腾了)
R语言的下载、安装及环境配置(Rstudio&VSCode)
R for Windows是一个免费的用于统计计算和统计制图的优秀工具,是R语言开发工具。它拥有数据存储和处理系统、数组运算工具(其向量、矩阵运算方面功能尤其强大)、完整连贯的统计分析工具、优秀的统计制图等功能。提供的图形界面,可以在其中访问控制台、创建脚本或安装其他软件包。
Sorting Algorithm-Shell Sort
Shell Sort-希尔排序 Algorithm: 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。 Ex: 49,38,65,97,76,13,27,49,55,04 第一次:步长为5 第一组:49,13 第二组:38,27 第三组:65,49 第四组
新手必看!Stata工具变量分析中的三大陷阱:如何正确解读LM统计量、CDW检验和Hansen J值
本文深度解析Stata工具变量分析中的三大核心检验:不可识别检验、弱IV检验和过度识别检验,帮助新手避开常见陷阱。详细解读LM统计量、CDW检验和Hansen J值的正确使用方法,提供实战案例和Stata操作指南,确保研究结论的可靠性。
SAP FICO 科目余额查询表开发说明书(包括测试样例、程序代码仅作参考,不保证一定可以运行)
SAP FICO 科目余额查询表开发说明书(包括开发源代码、测试样例)
FFmpeg 开发(14):Android FFmpeg + MediaCodec 实现视频硬解码
MediaCodec 是 Android 提供的用于对音视频进行编解码的类,它通过访问底层的 codec 来实现编解码的功能,是 Android media 基础框架的一部分,通常和 MediaExtractor, MediaSync, MediaMuxer, MediaCrypto, MediaDrm, Image, Surface和AudioTrack 一起使用。
Algs4 - Stack, Queues & Elementary Sorting,堆,栈,初级排序
文章目录Stack, Queues & Elementary SortingStack & QueuesGenerics and IteratorElementary Sort algorithmsSort Applications Stack, Queues & Elementary Sorting Stack & Queues Resizing Arrays,...
ArXiv 2026 即插即用 | Transformer篇 | WeightFormer:告别二次复杂度!无注意力的线性时间 Transformer,泛化能力拉满
WeightFormer是一种创新的动态Transformer架构,其核心创新在于通过双动态算子(空间自适应动态卷积和双边激活动态线性)实现输入自适应的特征提取。该模块采用静态-动态权重融合机制和低秩预测技术,在仅增加5%参数量的情况下显著提升模型泛化能力。相比传统Transformer,WeightFormer在ImageNet-1K上提升2.3%精度,小样本任务提升12%,同时保持线性计算复杂度。模块可直接替换标准Transformer块,特别适合轻量级视觉任务,实现了精度与效率的平衡。
C语言:Shell Sorting(希尔排序)
【代码】C语言:Shell Sorting。
IEM模型,地表粗糙度模拟
利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟
ET2012新版免狗免安装绿色软件
ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,
Shell Sort
希尔排序: #include #include #define NODE_NUM 10 //定义节点的数目 struct record { int key; }; typedef struct { struct record r[NODE_NUM+1]; int length; } SqList; typedef SqList HeapType; //??2éó??3Dò
OV9734 DATASHEET,完整规格书
OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等
手机变全球收音机:五万网络电台聚合与收听指南
网络电台通过流媒体协议将全球分散的音频源聚合,实现跨地域收听。其原理基于HTTP/HLS等协议传输音频流,并依赖元数据(如风格、语言、比特率)进行频道筛选与播放兼容性管理。技术价值在于打破传统广播的地域限制,提供稳定、低门槛的收听体验。典型应用场景包括通勤背景音、睡前放松及文化探索。本文围绕五万多个电台的聚合逻辑、工具选择与实操技巧,帮助用户高效构建个人收听体系。
jdk-8u144-linux-x64.tar.gz.
该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包
如何给Visual Sorting添加新排序算法?开发者手把手教程(附完整代码模板)
Visual Sorting(又名 "The Sound Of Sorting")是一个开源的**排序算法可视化工具**:它用动态变化的柱状图实时展示每一种排序算法的运行过程,并让柱子按高度发出不同音调,把"听声辨序"变成真正的沉浸式学习体验。本教程面向想为该项目贡献代码的开发者,手把手教你**如何给 Visual Sorting 添加一个全新的排序算法**——全程只需 4 个步骤、约 30 行
Internal Sorting
Θ(n2) Sorting Bubble Sort 从下往上逐渐把最小值浮上来,修改好的放在最上面 template <class Elem, class Comp> void bubsort(Elem A[], int n) { for (int i=0; i<n-1; i++) for (int j=n-1; j>i; j--) if (Comp::lt(A[j], A[j-1])) swap(A, j, j-1); } 比较次数是固定的,交换次数有极端值
Sorting-Algorithms-Blender 快速开始:只需 3 步在 Blender 中运行你的第一个排序可视化脚本
Sorting-Algorithms-Blender 是一个基于 Blender Python API 的开源**排序可视化**项目,它能在 Blender 场景中自动生成立方体、平面等基础网格,并通过逐帧插入关键帧的方式,生动还原冒泡排序、快速排序、归并排序等经典算法的完整执行过程。对算法初学者来说,这是最直观的排序算法可视化工具。本文将从零开始,用最快的路径带你完成环境准备、脚本运行与动画查看
Sorting-Algorithms-Blender 源码解析:keyframe_insert 关键帧驱动排序动画的实现原理
Sorting-Algorithms-Blender 是一个使用 Blender Python API 实现排序算法可视化的开源项目,它最巧妙的地方在于:整个动画完全由 `keyframe_insert` 这一个 API 驱动。没有骨骼绑定、没有物理模拟、没有动画曲线编辑器的手工操作——只要在排序算法执行的每一个关键节点调用 `keyframe_insert`,Blender 就会自动把对象的属性
Sorting-Algorithms-Blender 四种可视化形式深度对比:圆环旋转、颜色渐变、缩放柱状图与 3D 立方体,你该选哪种?
Sorting-Algorithms-Blender 是一款基于 Blender Python API 的排序算法可视化开源项目:它通过逐帧插入关键帧的方式,把冒泡、快速、归并、堆、希尔等经典排序算法的每一步移动,变成可播放的 3D 动画。项目内置四种截然不同的可视化形式——圆环旋转、颜色渐变、缩放柱状图与 3D 立方体。本文用一张速览表加深度拆解,帮你快速选出最适合自己的排序可视化方案。 ##
8种排序算法一网打尽:gh_mirrors/sor/sorting-visualizer的核心功能解析
gh_mirrors/sor/sorting-visualizer是一款强大的排序算法可视化工具,它能够将抽象的排序算法以直观的方式呈现出来,帮助用户理解不同排序算法的工作原理和性能差异。通过该工具,用户可以轻松比较8种常见排序算法的执行过程,包括冒泡排序、选择排序、插入排序、堆排序、归并排序、快速排序、希尔排序和鸡尾酒排序。 ## 为什么选择排序算法可视化工具? 对于初学者来说,排序算法往往
shell之sort命令
1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。 [rocrocket@rocrocket programming]$ cat seq.txtbananaapplepearorange[rocrocket@rocrocket programming]$ sort seq.txtap...
selection and insertion sort algorithms
2019独角兽企业重金招聘Python工程师标准>>> ...
Sorting Algorithms--Selection sort & Insertion Sort
Selection sortSelection sort is the most conceptually simple of all the sorting algorithms. It works by selecting the smallest (or largest, if you want to sort from big to small) element of the array and placing it at the head of the array. Then the proces
四、希尔排序(Shell Sort)
四、希尔排序(Shell Sort) 1959年Shell发明,第一个突破O(n^2)的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。 希尔排序的核心在于间隔序列的设定。既可以提前设定好间隔序列,也可以动态的定义间隔序列。动态定义间隔序列的算法是《算法(第4版》的合著者Robert Sedgewick提出的。 算法描述 小提示:...
1352



被折叠的 条评论
为什么被折叠?



