排序算法之希尔排序

embedded/2024/9/24 21:19:52/

目录

  • 一、简介
  • 二、代码实现
  • 三、应用场景


一、简介

算法平均时间复杂度最好时间复杂度最坏时间复杂度空间复杂度排序方式稳定性
希尔排序O(n^1.3)O(n)O(n^2)O(1)In-place不稳定

稳定:如果A原本在B前面,而A=B,排序之后A仍然在B的前面;
不稳定:如果A原本在B的前面,而A=B,排序之后A可能会出现在B的后面;
时间复杂度: 描述一个算法执行所耗费的时间;
空间复杂度:描述一个算法执行所需内存的大小;
n:数据规模;
k:“桶”的个数;
In-place:占用常数内存,不占用额外内存;
Out-place:占用额外内存。

希尔排序是将数据分组,将每一组进行插入排序。每一组排成有序后,最后整体就变有序了。希尔排序也称递减增量算法>排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定算法>排序算法
希尔排序是基于插入排序的以下两点性质而提出改进方法的:

插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;
但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位;
希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。

详细过程查看如下博客链接:
算法>排序算法 —— 希尔排序(图文超详细)

在这里插入图片描述

算法步驟:

选择一个增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1;
按增量序列个数 k,对序列进行 k 趟排序;
每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。仅增量因子为 1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。


二、代码实现

public class ShellSort {public static void shellSort(int[] arr) {//声明了整型变量len表示数组长度,以及临时变量tmp和j。int len = arr.length, tmp, j;//外层循环控制增量gap的大小,初始增量为数组长度的一半,每次循环将增量减半,直到增量为1。for (int gap = len / 2; gap >= 1; gap = gap / 2) {//内层循环从增量gap开始遍历数组,从第gap个元素开始,对每个元素进行插入排序。for (int i = gap; i < len; i++) {//将当前元素arr[i]保存到临时变量tmp中。tmp = arr[i];//初始化变量j为当前元素的前一个元素(间隔gap)的下标j = i - gap;//在内层循环中,如果j仍在数组范围内且前一个元素大于当前元素,就进行插入排序的操作。while (j >= 0 && arr[j] > tmp) {//将前一个元素后移一个间隔位置。arr[j + gap] = arr[j];//继续向前比较。j -= gap;}//将临时保存的当前元素插入到正确的位置。arr[j + gap] = tmp;}}}public static void shellSort2(int[] arr) {int len = arr.length, tmp, j;for (int gap = len / 2; gap >= 1; gap = gap / 2) {for (int i = gap; i < len; i++) {tmp = arr[i];j = i - gap;while (j >= 0 && arr[j] < tmp) {arr[j + gap] = arr[j];j -= gap;}arr[j + gap] = tmp;}}}public static void main(String[] args) {int[] arr = {12, 11, 15, 50, 7, 65, 3, 99};System.out.println("---排序前:  " + Arrays.toString(arr));shellSort(arr);System.out.println("希尔排序从小到大:  " + Arrays.toString(arr));shellSort2(arr);System.out.println("希尔排序从大到小:  " + Arrays.toString(arr));}}

输出:
在这里插入图片描述

三、应用场景

希尔排序的平均时间复杂度:O(n^1.3)
所以,希尔排序的时间复杂度会比o(n^2)好一些
是一种高效的插入排序优化算法,适用于中规模数据量的排序。 通过将数据按增量分组并进行直接插入排序,希尔排序可以在处理大规模数据时保持较高的效率。 在实际应用中,希尔排序可以被用于各种需要对数据进行快速排序的场景,如 数据库索引、文件系统排序等。

参考链接:
算法>排序算法 —— 希尔排序(图文超详细)
八大算法>排序算法——希尔(shell)排序(动图演示 思路分析 实例代码java 复杂度分析)


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

相关文章

项目二:学会使用python爬虫请求库(小白入门级)

上一章已经了解python爬虫的基本知识&#xff0c;这一次让我们一起来学会如何使用python请求库爬取目标网站的信息。当然这次爬虫之旅相信我能给你带来不一样的体验。 目录 一、安装requests 库 简介 安装 步骤 1.requests的基本使用3步骤 2.查看所使用编码 3.设置编码…

EasyExcel追加写入数据,分批查询多次写入场景下,注意使用方式【OOM警告】

使用.withTemplate(file) 将临时数据文件和真实数据文件合并的方式&#xff0c;在生产环境大批量数据下&#xff0c;完全不可取&#xff0c;有很高的内存溢出风险 伪代码 public static void writeAppend(String fileName) {String filePath "tempDir".concat(Fil…

C++类和对象:构造函数,析构函数,拷贝构造

文章目录 1.类的6个默认成员函数2. 构造函数2.1 概念2.2 特性 3.析构函数3.1 概念3.2 特性 4.拷贝构造 1.类的6个默认成员函数 一个类中什么都不写&#xff0c;就是空类。而空类实际上有成员&#xff0c;当一个类中什么都不写时&#xff0c;编译器会生成六个对应默认成员函数。…

医学访问学者专栏-申请条件及类别

在国外访问学者申请中&#xff0c;医学领域的研究、教学及从业人员占有相当大的比例&#xff0c;这些医学访问学者都有哪些申请条件及类别&#xff1f;本文知识人网小编就相关问题进行详细阐述&#xff0c;并附带案例说明。 一、医学访问学者的职业发展前景如何&#xff1f; 1…

负载均衡的原理及算法

负载均衡&#xff08;Load Balancing&#xff09;是指在计算机网络中将工作负载&#xff08;如请求、数据流量等&#xff09;分配给多个计算资源&#xff08;如服务器、网络连接等&#xff09;&#xff0c;以实现资源利用的均衡和性能优化。其原理和算法如下&#xff1a; 原理…

ceph介绍

一、前言 Ceph 是一个完全分布式的系统&#xff0c;它将数据分布在整个集群中的多个节点上&#xff0c;以实现高可用性和容错性&#xff0c;ceph支持对象存储、块存储、文件存储所以被称为统一存储&#xff0c;ceph的架构由以下组件组成:mon、mgr、osd、mds、cephfs、rgw&#…

(最新)华为 2024 届实习招聘-硬件通⽤/单板开发——第十一套和十二套

&#xff08;最新&#xff09;华为 2024 届实习招聘-硬件通⽤/单板开发——第十一套和十二套 部分题目分享&#xff0c;完整版带答案(有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&#xff0c;仅供参考&#xff09;&#xff08;共十套&#xff09;获取&#xff…

「GO基础」文件名规范、关键字与标识符

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…