希尔排序

希尔排序

排序步骤

1、分组,以任意长度进行分组(这个长度我们称作增量gap);通常以总长度的一半这个数为依据进行分组,每间隔 gap 个数即为一组

2、组内排序;组内使用插入排序法进行排序

3、重新设置间隔分组;此次间隔数一般为原来的间隔数 gap 的基础上减半

4、组内排序

....... 

重复如上操作,最终,间隔数会减半到1,实现整体的插入排序,整体序列变为有序

什么不直接使用插入排序法?

希尔排序实际上是对插入排序的一种优化。插入排序在面对大规模的杂乱的数据时,需要进行多次交换,较为复杂;而希尔排序将大规模的数据减半,极大缩小了需要排序数据的规模,同时在最终的整体的数据进行排序时,整体数据近乎有序,此时进行插入排序的效率好

解析说明

希尔排序的效率取决于增量的选取,时间复杂度并不是一个定值

1) 最好情况:序列是正序排列,在这种情况下,需要进行的比较操作需(n-1)次。后移赋值操作为0次。即O(n)
2) 最坏情况:O(nlog2n)
3) 平均时间复杂度:O(nlog2n)

开始时,gap 取值较大,子序列中的元素较少,排序速度快,克服了直接插入排序的缺点

其次,gap值逐渐变小后,虽然子序列的元素逐渐变多,但大多元素已基本有序,所以继承了直接插入排序的优点,能以近线性的速度排好序

因此,希尔排序的时间复杂度相对于O(n²)好一些

最优的空间复杂度为开始元素已排序,则空间复杂度为 0;

最差的空间复杂度为开始元素为逆排序,则空间复杂度为 O(N);

平均的空间复杂度为O(1)

希尔排序代码

import org.junit.Test;public class ShellSort {@Testpublic void test(){int[] arr = new int[]{12, 15, 4, 5, 8, 35};shellSprt(arr);for (int i : arr) {System.out.print(i + " ");}}public static int[] shellSprt(int[] arr){int gap = arr.length /2;//一开始时的间距数int temp = 0;//插入排序的临时数while(gap > 0){//最后一遍排序的gap值为1for (int i = gap; i < arr.length; i++) {//每组的第一个数被认为是有序。因此从第二组数开始进行插入排序temp = arr[i];//当前需要插入的数for (int j = i; j >= gap; j -= gap) {//每组之间的每个数之间都相差gap个数if(temp < arr[j - gap]){//插入排序向前比较arr[j] = arr[j - gap];}else{break;//找到插入的位置则退出}arr[j - gap] =temp;//需要插入的位置}}gap /= 2;//gap不断减半直到其值为1}return arr;}
}

引用

【算法】排序算法之希尔排序 - 知乎 (zhihu.com)

排序:希尔排序(算法) - 简书 (jianshu.com)

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

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

相关文章

微服务Gateway网关(自动定位/自定义过滤器/解决跨域)+nginx反向代理gateway集群

目录 Gateway网关 1.0.为什么需要网关&#xff1f; 1.1.如何使用gateway网关 1.2.网关从注册中心拉取服务 1.3.gateway自动定位 1.4.gateway常见的断言 1.5.gateway内置的过滤器 1.6.自定义过滤器-全局过滤器 1.7.解决跨域问题 2.nginx反向代理gateway集群 2.1.配置…

Upsource的下载安装使用

一&#xff0c;下载 下载地址&#xff1a; https://www.jetbrains.com/upsource/下载并解压到指定的文件夹 ├── api ├── apps ├── backups # 备份目录 ├── bin # 应用目录 ├── conf # 配置文件 ├── data ├── internal ├── launcher ├── lib ├─…

Java集合详解

1. 集合基础 1.1 集合概述 1.2 ArrayList构造方法和添加方法 1.3 ArrayList集合常用方法 1. 集合基础 1.1 集合概述 集合类的特点:提供一种存储空间可变的存储横型&#xff0c;存储的数据容量可以发生改变 ArrayList ArrayList< >: 可调整大小的数组实现 < >:是…

TextView 必填项pro版

优点 基本解决对齐方式,可以设置前缀隐藏和显示 /*** https://blog.csdn.net/u013982652/article/details/94404711* Android自定义TextView实现必填项前面的*号* 另一种实现方式(推荐使用这种,有非必填情况的话不会有对齐问题)* <p>* <cn.mvp.mlibs.weight.MiRequire…

【Fiddler】Fiddler实现mock测试(模拟接口数据)

软件接口测试过程中&#xff0c;经常会遇后端接口还没有开发完成&#xff0c;领导就让先介入测试&#xff0c;然后缩短项目时间&#xff0c;有的人肯定会懵&#xff0c;接口还没开发好&#xff0c;怎么介入测试&#xff0c;其实这就涉及到了我们要说的mock了。 一、mock原理 m…

CentOS 安装字体 微软雅黑

fc-list命令查看已经安装的字体 fc-list :langzh命令可以查看已安装的中文字体 找到windows系统里面的字体 上传到服务器 /usr/share/fonts/winFonts 下&#xff0c;winFonts目录是自己建立的&#xff0c;名称无要求 如果C:\Windows\Fonts下的字体没法直接传输将这个文件夹复…

Leetcode-每日一题【24.两两交换链表中的节点】

题目 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4]输出&#xff1a;[…

rust 引用怎么用

本来好好的引用&#xff0c;被 rust 玩坏了&#xff0c;搞得自己都不会使用引用了&#xff0c;我们还是从简单的例子入手&#xff0c;来探索使用引用可能遇到额问题。 下面的示例代码编译不通过&#xff0c;在 s1 赋值给变量 s2 的过程中&#xff0c;字符串 neojos 值的所有权…

dede tag彩色随机大小的样式修改方法

dede tag彩色随机大小的样式修改方法&#xff0c;打开include/common.func.php 在最下面添加以下代码&#xff1a; //TAG彩色 jinmengqiang.cn function getTagStyle() { $minFontSize8; //最小字体大小,可根据需要自行更改 $maxFontSize18; //最大字体大小,可根据需要自行更改…

Unity 上传文件到阿里云 对象存储OSS服务器

首先登录阿里云 免费试用–对象存储OSS --点击立即试用&#xff0c;可以有三个月的免费试用 创建Buket 新建AccessKey ,新建完成后&#xff0c;会有一个CSV文件&#xff0c;下载下来&#xff0c;里面有Key &#xff0c;代码中需要用到 下载SDK 双击打开 sln文件&#xff0…

STM32(HAL库)通过ADC读取MQ2数据

目录 1、简介 2、CubeMX初始化配置 2.1 基础配置 2.1.1 SYS配置 2.1.2 RCC配置 2.2 ADC外设配置 2.3 串口外设配置 2.4 项目生成 3、KEIL端程序整合 3.1 串口重映射 3.2 ADC数据采集 3.3 主函数代 3.4 效果展示 1、简介 本文通过STM32F103C8T6单片机通过HAL库方式对M…

解决Git fatal: refusing to merge unrelated histories报错

问题描述 当在远程建立了一个仓库&#xff0c;并且远程的仓库已经初始化了的情况&#xff0c;使用 git remote add origin gitgithub.com:xxx/xxx.git命令添加远程仓库后&#xff0c;执行git pull,然后提示如下&#xff1a; 大致意思就是需要关联我们的本地和远程分支。按照…