关于希尔排序的理解

embedded/2024/10/19 9:54:19/

今天复习希尔排序的时候,对希尔排序有了新的理解

首先希尔排序是什么:希尔排序(Shell Sort)是一种基于插入排序的算法>排序算法,又称缩小增量排序(Diminishing Increment Sort),是直接插入排序的一种更高效的改进版本。希尔排序通过将数组元素按一定增量分组,对每组使用直接插入算法>排序算法排序,随着增量逐渐减少,每组包含的元素越来越多,当增量减至1时,整个数组恰被分成一组,算法便终止。

希尔排序的核心在于选择初始增量和后续减少增量的策略。常用的增量选择策略有希尔增量(Shell's original increment sequence)、希伯特增量(Hibbard increment sequence)、Sedgewick增量等

说人话就是希尔排序是插入排序的升级,具体内容是把数据分成一个个组,然后每个组进行希尔排序,然后再把整体进行排序,这样尽量把小数据往前放,提高效率。

然后是代码实现:

private static void shellSort(int[] arr) {int length = arr.length;int position = 0;//分组,i是组数也是步长for (int step = length / 2; step > 0; step = step / 2) {//循环每个组第一个元素,然后后续通过第一个元素遍历所有元素for (position = 0; position < step; position++) {insertStep(arr,length,position,step);}}
}

/*** @param arr       数组* @param length    长度* @param iPosition 当前位置* @param step      步长,也就是几个组*/
private static void insertStep(int[] arr, int length, int iPosition, int step) {Integer j=0;for (int i = iPosition + step; i < length; i = i + step) {int temp=arr[i];for (j = i-step; j >= 0; j = j - step) {if(arr[j]>arr[i]){arr[j+step]=arr[j];}else{break;}}arr[j+step]=temp;}
}

然后很多人在写这部分代码的时候表示很难写清楚,我告诉大家一个好方法:

把这个算法分成两部分,第一部分只负责分组及操作(不具体排序),第二部分只负责排序,

首先第一部分:

分组,我们需要不断分组,比如一共10个数排序,先除以2,分成5份(也就是步长是5,下边回会用),每份下标就是[0,5],[1,6],[2,7],[3,8],[4,9],(注意这是下标,不是值),然后再除以2,分成2份,以此类推,直到分成一份;然后我们要每个组进行操作:

 分组:

int length = arr.length;

//这里分组数就是步长(每组下个元素需要跳的步长),大家试着理解一下

for(int step=length/2;step>;step=step/2)

分组后每个组进行操作:

for (int step = length / 2; step > 0; step = step / 2) {

//循环每个组第一个元素,然后后续通过第一个元素遍历所有元素

        for (position = 0; position < step; position++) 

  

        }

到这里大家先不要管排序的事,只管这里分组和要怎么操作分组。

然后第二部分,排序:

排序就是排序,大家不要管分组的事,只要记得这里有个步长,也就是分几组就行,后边会用

我们分析不分组的插入和分组的插入有什么区别

不分组的时候我们插入每个值的时候是这样:

for(int i=1;i<n;i++)

也就是起始位置是,第一个,然后每次增加的位置是1,也就是i+1

分组的时候,只有间隙不一样,也就是增加的位置不一样,不是+1,而是+step也就是步长:

比如第一个组:

for(int i=0+step;i<n;i=i+step);

当然第二个组就是

for(int i=1+step;i<n;i=i+step);

这个i就是第一个组第几个元素,先记下,后边会说

然后再看插入排序第二层循环,有什么区别:
for(int j=i-1;i>0;j=j-1);

同理,分组后:

for(int j=i-step;i>0;j=j-step);

然后我们将两部分综合起来,发现排序的第一步也就是

for(int i=0+step;i<n;i=i+step);这里i=0+step,这个0就是分组后的第几个元素,也就是分组后的内层循环  for (position = 0; position < step; position++) 里的position,所以我们可以将两部分合起来:

//分组,i是组数也是步长
for (int step = length / 2; step > 0; step = step / 2) {//循环每个组第一个元素,然后后续通过第一个元素遍历所有元素for (position = 0; position < step; position++) {insertStep(arr,length,position,step);}
}

排序:

private static void insertStep(int[] arr, int length, int iPosition, int step) {Integer j=0;for (int i = iPosition + step; i < length; i = i + step) {int temp=arr[i];for (j = i-step; j >= 0; j = j - step) {if(arr[j]>arr[i]){arr[j+step]=arr[j];}else{break;}}arr[j+step]=temp;}
}

这里iPosition就是分组传过来的参数        


http://www.ppmy.cn/embedded/128711.html

相关文章

结构体指针

结构体指针 作用&#xff1a;通过指针访问结构体中的成员。 利用操作符->可以通过结构体指针访问结构体属性。 struct student() {string name;int age;int score; } int main() {student s {"张三",18,100};struct *p &s;cout << "姓名&…

《环境感知:开启智能生活新视角》

《环境感知&#xff1a;开启智能生活新视角》 一、环境感知的定义与作用二、环境感知的技术与方法&#xff08;一&#xff09;传感器技术&#xff08;二&#xff09;数据融合技术&#xff08;三&#xff09;机器学习与深度学习技术 三、环境感知在不同领域的应用&#xff08;一…

【进阶OpenCV】 (14)-- 人脸识别 -- LBPH 算法

文章目录 LBPH 算法一、基本思想二、LBPH算法步骤1. 图像划分2. 局部二值模式特征提取3. 直方图统计4. 特征向量生成5. 相似度计算 三、代码实现1. 图像预处理2. 创建一个LBPH的人脸识别器3. 训练实例模型4. 图像预测 总结 LBPH 算法 **LBPH(Local Binary Patterns Histogram&…

[论文笔记] llama3.2 蒸馏

参考链接: LLaMA3.2技术报告: GitHub - meta-llama/llama-stack: Model components of the Llama Stack APIs [2407.21783] The Llama 3 Herd of Models https://ai.meta.com/blog/llama-3-2-connect-2024-vision-edge-mobile-devices/ HuggingFace:

D2000国产化加固笔记本电脑:筑牢信息安全防线

在这个数字化时代&#xff0c;信息技术的飞速发展不仅极大地丰富了我们的生活与工作方式&#xff0c;也悄然间将数据安全推向了前所未有的高度。近期&#xff0c;微软蓝屏事件再次敲响了全球用户心中的警钟&#xff0c;提醒我们&#xff0c;在享受技术便利的同时&#xff0c;电…

逍遥安卓模拟器命令行合集(memuc命令)

逍遥安卓模拟器命令行合集&#xff08;memuc命令&#xff09; 用cmd自行测试 模拟器配合工具&#xff1a;memuc是v6.0.0版本推出的命令行工具&#xff0c;它封装了MEmuConsole、MEmu、MEmuManage的接口&#xff0c;支持多开管理、修改配置、android通信、adb命令等功能。 memu…

vue3如何运用组合式写法,封装表格列表请求数据的逻辑

1.代码如下&#xff1a; import { getPageList } from "/api/cloudExhibitionHall" import { ref, watch } from "vue"// 特殊参数传参 const role JSON.parse(localStorage.getItem(current-role) || {}) const tenantId role.tenantId ? role.tenant…

论文阅读(十六):Deep Residual Learning for Image Recognition

文章目录 1.介绍2.基本原理3.两种残差块4.网络结构 论文&#xff1a;Deep Residual Learning for Image Recognition   论文链接&#xff1a;Deep Residual Learning for Image Recognition   代码链接&#xff1a;Github 1.介绍 在ResNet网络提出之前&#xff0c;传统的卷…