排序算法-希尔排序

上一篇讲解了简单插入排序算法,以及在其基础上优化的二分插入排序算法,但是每次插入需要按间隔为 1 移动有序区的元素,效率不高,下面我们来介绍一种新的插入排序算法-希尔排序。

算法简介

希尔排序(Shell Sort),也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法
希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能。这样可以让一个元素可以一次性地朝最终位置前进一大步。然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需排序的数据几乎是已排好的了(因为直接插入排序在元素基本有序的情况下,效率是很高的)。

算法描述

  • 先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d。
  • 对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。
  • 当增量减到1时,进行直接插入排序后,排序完成。

希尔

代码实现

    /*** 希尔排序** @param array*/private static void shellSort(int[] array) {if (array == null || array.length == 0 || array.length == 1)return;int gap = array.length / 2;while (gap > 0) {// 逐渐减小gap,最终为1,进行直接插入排序for (int i = 0; i < gap; i++) {// 排序第i组,每一组内部进行插入排序for (int j = gap + i; j < array.length; j += gap) {// 直接插入排序的间隔1变为gap即可int index = j;int insertVal = array[j];while (index > gap - 1 && insertVal < array[index - gap]) {array[index] = array[index - gap];index -= gap;}array[index] = insertVal;//放置insertVal}}gap = gap >> 1;}}

性能分析

希尔排序的时间复杂度是和所取的序列增量有关。希尔排序的时间复杂度分析较为复杂。下面直接给出结论。

本文选用的就是常用的Shell增量序列,Shell增量序列的最坏时间复杂度为\(O(n^2)\)

Hibbard增序序列最坏时间复杂度为\(O(n^{3/2})\),平均时间复杂度约为\(O(n^{5/4})\)

Sedgewick增量序列的最坏时间复杂度为\(O(n^{4/3})\);平均时间复杂度约为\(O(n^{7/6})\)

空间复杂度都是\(O(1)\)

希尔排序会破坏元素间相互位置,因此希尔排序是不稳定的。

转载于:https://www.cnblogs.com/wupeixuan/p/8658363.html

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

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

相关文章

封包时发现的关于QIODevice类write函数的坑

关于QIODevice类write函数的坑问题概述问题部分代码问题解决结论问题概述 这两天在做TCP通信的封包解包协议操作时&#xff0c;不经意间被write函数坑了好久。通过内存复制进行数据封包&#xff0c;在写入socket的时候总是写入一个字节&#xff0c;不能全部写入数据&#xff0…

java c++ python哪个好_程序员学java好还是python语言好 c++又如何

技术程序员学Java、C、Python... 分析对比&#xff0c;到底学什么语言吃香&#xff0c;哪种语言最靠谱&#xff0c;如何学好这些语言呢&#xff1f;几天前&#xff0c;我们在知识上看到这样一个问题&#xff1a;“java&#xff0c;C&#xff0c;Python&#xff0c;走&#xff0…

Qt多文件传输功能实现及方法概述

Qt多文件传输功能实现前言代码实现概述客户端代码实现服务端代码效果展示结论前言 本次设计主要是为了功能上的实现&#xff0c;因此对于ui界面的设计都是怎么简单怎么来的&#xff0c;主要的功能就是实现多个文件的发送与接收&#xff0c;即客户端发送&#xff0c;服务端接收…

jedispool redis哨兵_Redis详解(九)------ 哨兵(Sentinel)模式详解

在上一篇博客----Redis详解(八)------ 主从复制,我们简单介绍了Redis的主从架构,但是这种主从架构存在一个问题,当主服务器宕机,从服务器不能够自动切换成主服务器,为了解决这个问题,我们又介绍了哨兵模式,本篇博客我们继续深入的介绍一下这种模式.1、架构图2、服务器列表3、搭…

从java到C++入门

C基础知识前言基础前言 当初为了赶一波互联网热潮自学了java&#xff0c;如今因为需要就从java转向C开发&#xff0c;于是就有了java到C入门&#xff0c;每次的学习我都会记录一下C的学习历程。 基础 C对于内存的控制管理比java要有更多要求&#xff0c;因此C对于变量的创建…

wordpress 外部数据接口_使用接口方式获取WordPress用户信息的方法

今天WordPress主题站简单介绍一下WordPress系统中用户信息获取方式&#xff0c;今天就讲讲使用接口方式获取WordPress用户信息的方法。接口文件如下&#xff1a;if (POST ! $_SERVER[REQUEST_METHOD]) {header(Allow: POST);header(HTTP/1.1 405 Method Not Allowed);header(Co…

结构体内存拷贝的两种方法

结构体内存拷贝的两种方法前言内容总结前言 最近看一些代码&#xff0c;发现内存拷贝的两种方式&#xff0c;下面我就来介绍一下两种方式。 内容 首先定义一个结构体processorHead.h&#xff1a; #pragma pack(1)typedef struct {short b;int c;long long d; }DATA;#pragma…

大学物理实验长度的测量实验报告_大学物理实验教案长度和质量的测量两篇

大学物理实验教案长度和质量的测量两篇篇一&#xff1a;大学物理实验教案4--长度测量大学物理实验教案实验目的&#xff1a;1&#xff0e;掌握游标卡尺、螺旋测微计和移测显微镜的测量原理和使用方法。 2&#xff0e;根据仪器的精度和有效数字的定义&#xff0c;正确记录原始数…

Linux命令应用大词典-第25章 备份与还原

25.1 mkisofs:创建ISO9660/Joliet/hfs文件系统转载于:https://www.cnblogs.com/tqtl911/p/8661006.html

C++灵魂->指针

C灵魂->指针地址指针野指针空指针 【内存动态分配】指针变量的运算&#xff08;&#xff0c;-&#xff0c;&#xff0c;--&#xff09;指针与一维数组地址 计算机将内存以单个字节为单位分开&#xff0c;并对每个字节进行唯一性编号&#xff0c;那么这个编号就是地址。 取…

cpython cython_python – 优化Cython中的字符串

我建议你在cpython.array.arrays上进行你的操作.最好的文档是C API和Cython源码,我太懒了链接了.from cpython cimport arraydef cfuncA():cdef str acdef int i,jfor j in range(1000):a .join([chr(i) for i in range(127)])def cfuncB():cdef:str aarray.array[char] arr,t…

团队协作小结

0.前提&#xff1a;协作目标保持一致&#xff0c;目标理解一致。 1.量化工作内容&#xff0c;以工作量算&#xff0c;可以适当结合成员自身特点划分内容。 2.职责明确&#xff0c;工作块必须有一名负责人&#xff0c;不要搞多人化&#xff0c;防止责任推诿。 转载于:https://ww…

TCP解决粘包问题(结构数据封包拆包)

TCP封包拆包前言封包一、包结构二、封包方法拆包总结前言 TCP协议(Transmission Control Protocol&#xff09;是一种面向连接的、可靠的、基于字节流的通信协议&#xff0c;即TCP采用字节流的方式&#xff0c;以字节为单位传输字节序列。 如果简单的发送长串的数据流&#xf…

mac下nvm_mac中nvm的安装和使用

nvm 是 Mac 下的 node 管理工具&#xff0c;如果是管理 Windows 下的 node&#xff0c;可以使用 nvmw 或 nvm-windows 。一、若电脑中已安装node,需先卸载。参考学习的文档&#xff1a;http://blog.csdn.net/zjuwwj/article/details/72805671npm ls -g --depth0# 查看已经安装在…

求交错序列前N项和(15 分)

7-2 求交错序列前N项和&#xff08;15 分&#xff09; 本题要求编写程序&#xff0c;计算交错序列 1-2/33/5-4/75/9-6/11... 的前N项之和。 输入格式: 输入在一行中给出一个正整数N。 输出格式: 在一行中输出部分和的值&#xff0c;结果保留三位小数。 输入样例: 5输出样例: 0.…

拆包--缓冲区查找包头及包尾偏移

缓冲区查找包头及包尾偏移前言一、采用动态数组QByteArray的自带函数二、采用字节对比方法测试代码前言 根据前面所讲的内容封包拆包&#xff0c;当将网络中的数据读出存储在自定义缓冲区QByteArray中&#xff0c;则对数据包进行拆分。则首先要进行的工作就是找到包头的位置及…

5自适应单页源码_超详细!如何建立一个CPA单页网站,附高转化CPA模板源码

做CPA的老手一般都会建立一个CPA单页站&#xff0c;用来提升转化&#xff0c;提高推广质量。今天教大家搭建一个完整的CPA单页站搭建一个网站需要3样东西&#xff1a;域名服务器网站源码一、购买域名域名就是你网站的地址&#xff0c;建议从万网购买就可以&#xff0c;比较方便…

20154319 《网络对抗技术》后门原理与实践

一、实验说明 任务一&#xff1a;使用netcat获取主机操作Shell&#xff0c;cron启动 (0.5分) 任务二&#xff1a;使用socat获取主机操作Shell, 任务计划启动 (0.5分) 任务三&#xff1a;使用MSF meterpreter&#xff08;或其他软件&#xff09;生成可执行文件&#xff0c;利用…

强制类型转换的取整及四舍五入取整

强制类型转换取整相关前言取整方法例&#xff1a;(signed int)double四舍五入取整前言 开发中一般运算过程都采用浮点类型数据以免出现运算不精确的错误&#xff0c;而当运算结果需要时整型的时候就需要对浮点类型的结果进行取整处理&#xff0c;而取整的方法有向上取整&#…

github电脑壁纸_GitHub - githubtaotao/bing-wallpaper: Bing每日壁纸,自动获取Bing的精美图片设置为壁纸,并且支持随机切换历史壁纸,查看壁纸故事...

Bing每日壁纸发布一个开源小软件&#xff0c;Bing每日壁纸。该小软件可以自动获取Bing的精美图片设置为壁纸&#xff0c;并且支持随机切换历史壁纸&#xff0c;查看壁纸故事。欢迎大家下载使用&#xff0c;点star&#xff01;有问题请留言或者提issue。想了解技术原理的请看 技…