iOS(Object C) 希尔排序

希尔排序就是升级版本的 插入排序,

插入排序的文章请看我另一篇:iOS(Object C) 插入排序-CSDN博客

希尔排序的思想:

1.取一个整数d1 = N/2 (N为数组长度),将数组里的元素分成d1 个组,每组相邻元素之间的距离为d1,在各组内进行插入排序

2.取第二个整数d2=d1/2,重复步骤1的分组排序过程,直到di=1;即所有元素在同一组内直接进行插入排序.

3.完成步骤1、2,即可以得到一个有序数组.

如下图,数组为[5,3,8,7,1,4,2,6,9], 

d1 = 数组长度9/2 = 4; 所以将数组分成4组,没组的元素之间距离为4,即(5,3,8为一组,7,1为一组,4,2为一组,6,9为一组),将没组进行插入排序即可


 

插入排序的思想:

可以想象你在打牌,手里有一张牌2,

第一次摸到一张牌5; 5 比1 大,所以摸到的牌5放在1的右边; (此时手里的牌为 2->5)

第二次摸到一张牌3; 3比5小,所以3和5互换位置,再拿3和2比,3比2大,3不动(此时手里的牌为 2-> 3 -> 5)

第三次摸到一张牌1,1比5小,所以1和5互换位置;再拿1和3比,1比3小,所以1和3互换位置;再拿1和3比,1比2小,所以1和2互换位置; 

可以看到插入排序是相邻的两张牌(距离为1)比较大小,而希尔排序是距离为di的两张牌的牌比大小,明白了这个原理,就很简单了.

- (NSMutableArray *)shellSort:(NSMutableArray *)array
{//定义一个间隔数int gap = (int)array.count/2;while (gap >= 1){for (int i = gap; i < array.count; i ++){int temp = [array[i] intValue];int j = i;while (j >= gap && temp < [array[j-gap] intValue]){[array exchangeObjectAtIndex:j withObjectAtIndex:j-gap];j -= gap;}}gap = gap/2;}return array;
}

仔细比较插入排序和希尔排序的代码,你会发现上 把插入排序里的数字1,改为间隔距离di, 即可完成99%,最后再把di整除2即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/645318.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux内核驱动开发-字符设备驱动框架

1前置条件 &#xff08;1&#xff09;【linux】内核编译结束 &#xff08;2&#xff09;【linux】目录配置跳转文件&#xff1a;补充&#xff1a;配置的跳转文件只能在【linux】目录下使用&#xff0c;子目录无法使用2驱动框架 2.1编写驱动程序 #include <linux/init.h&g…

手撕sql面试题:计算出在校人数,字段中含有学生的学制

今天分享一道面试题!如下&#xff1a; 有一个录取学生人数表&#xff0c;记录的是每年录取学生人数和入学学生的学制 以下是表结构&#xff1a; CREATE TABLE admit ( id int(11) NOT NULL AUTO_INCREMENT, year int(255) DEFAULT NULL COMMENT 入学年度, num int(255) …

工业相机和镜头参数和选型

工业相机和镜头参数和选型 文章目录 工业相机和镜头参数和选型前言一、相机参数解释和选型1.相机参数1.1快门-shutter1.2曝光-exposure1.3增益-gain1.4 感光芯片类型&#xff08;CCD/CMOS&#xff09;1.5 感光芯片&#xff08;靶面&#xff09;尺寸1.6 分辨率1.7 像元尺寸1.8 帧…

前端补充17(JS)

一、JS组成成分 JS的组成成分&#xff0c;由三部分组成 第一、ECMAScript&#xff1a;语法规则&#xff0c;如何定义变量&#xff0c;数据类型有哪些&#xff0c;如何转换数据类型&#xff0c;if判断 if-else while for for-in forEach do-while switch 数组 函数 对…

SpringSecurity授权流程(自己做笔记用的)

目录 一、RABC表的设计 二、查询权限并添加Security中 三、通过注解进行授权 四、授权进行前端访问 一、RABC表的设计 基本概念就是五个表&#xff1a; 用户表&#xff1a;users 角色表&#xff1a;role 权限表&#xff1a;permission 还需要两种关系表&#xff0c;才能通过…

LDA主题模型

在文本挖掘领域&#xff0c;大量的数据都是非结构化的&#xff0c;很难从信息中直接获取相关和期望的信息&#xff0c;一种文本挖掘的方法&#xff1a;主题模型&#xff08;Topic Model&#xff09;能够识别在文档里的主题&#xff0c;并且挖掘语料里隐藏信息&#xff0c;并且在…

Hbase学习笔记

Hbase是什么 HBase是一个高可靠、高性能、面向列、可伸缩的分布式存储系统。它利用Hadoop HDFS作为其文件存储系统,并提供实时的读写的数据库系统。HBase的设计思想来源于Google的BigTable论文,是Apache的Hadoop项目的子项目。它适合于存储大表数据,并可以达到实时级别。HB…

Java基础知识(一)

1. Java语言跨平台原理 1.1 Java语言的特点 完全面向对象&#xff1a; Java语言支持封装、继承、多态&#xff0c;面向对象编程&#xff0c;让程序更好达到高内聚&#xff0c;低耦合的标准。支持分布式&#xff1a; Java语言支持Internet应用的开发&#xff0c;在基本的Java应…

实现ALV页眉页脚

1、文档介绍 在ALV中&#xff0c;可以通过增加页眉和页脚&#xff0c;丰富ALV的展示。除了基本的页眉和页脚&#xff0c;还可以通过插入HTML代码的方式展示更加丰富的页眉和页脚&#xff0c;本篇文章将介绍ALV和OOALV中页眉页脚的使用。 2、ALV页眉页脚 效果如下 2.1、显示内…

贝叶斯网络(概念、应用、实例)

目录 一、贝叶斯网络基本概念 1.1主要组成 1.2概率模型 1.3应用场景 1.4推理方法 1.5学习 二、贝叶斯网络在机器学习中的应用 三、应用实例 3.1分类 3.2推荐系统 3.3自然语言处理 一、贝叶斯网络基本概念 贝叶斯网络&#xff0c;也称为信念网络或有向无环图模型&am…

JMeter压测

1.创建线程组 2.创建http请求 填写接口基本信息。&#xff08;我这里用的是我自己的一个demo项目&#xff0c;大家也可以换成自己的试一试&#xff09; 填写完毕之后我们点击绿色箭头运行。由于没有配置请求头信息&#xff0c;所以显示认证失败。 3.创建信息头管理器 3.1为什么…

基于激光雷达的作物表型研究论文汇总

文章目录 2018How Universal Is the Relationship between Remotely Sensed Vegetation Indices and Crop Leaf Area Index? A Global Assessment[J] 2021结合移动式激光雷达和 CropQuant-3D 对不同氮素处理小麦的大规模田间表型分析[M] 2023基于地基激光雷达和 RGB 相机对小麦…