当前位置: 首页 > article >正文

Java算法之希尔排序(Shell Sort)

简介

希尔排序,又称为缩小增量排序,是插入排序的一种改进算法。它通过引入增量序列,将原始数据序列分成多个子序列,对每个子序列进行插入排序,然后逐渐减小增量,直到增量为1,完成整个排序过程。

算法步骤

  1. 选择一个增量序列,例如初始时为数组长度的一半。
  2. 将数组分为多个子序列,每个子序列的元素间隔为增量序列的第一个值。
  3. 对每个子序列进行直接插入排序。
  4. 逐步减小增量序列的值,重复步骤2和3,直到增量为1。
//shellSort 方法接受一个整型数组 arr 作为参数。
//增量 gap 初始设置为数组长度的一半,然后每次减半。
//外层循环控制增量序列的迭代次数。
//内层循环实现插入排序,将当前元素与前面间隔为 gap 的元素进行比较和交换。
//使用一个临时变量 temp 来存储需要插入的元素。
public class ShellSort {
    public static void shellSort(int[] arr) {
        int n = arr.length;
        int gap = n / 2; // 初始增量

        while (gap > 0) {
            for (int i = gap; i < n; i++) {
                int temp = arr[i];
                int j;

                // 将较大的元素后移
                for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {
                    arr[j] = arr[j - gap];
                }
                arr[j] = temp;
            }
            gap = gap / 2; // 更新增量
        }
    }

    public static void main(String[] args) {
        int[] arr = {3, 7, 4, 8, 6, 2, 1, 5};
        shellSort(arr);

        // 打印排序后的数组
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

优点

  • 效率提升:相较于普通插入排序,希尔排序在大数据集上效率更高。
  • 稳定性:希尔排序是稳定的排序算法,相等元素的相对位置不会改变。
  • 空间优势:空间复杂度为O(1),不需要额外的存储空间。

缺点

  • 效率不稳定:增量序列的选择对算法性能有较大影响,且最坏情况下时间复杂度仍为O(n^2)。
  • 实现复杂性:相比于普通插入排序,希尔排序的实现更为复杂。

时间复杂度和空间复杂度分析

  • 时间复杂度:平均情况下为O(n(log n)^2),最坏情况下为O(n^2),这取决于增量序列的选择。
  • 空间复杂度:O(1),因为除了原始数组外,不需要额外的存储空间。

使用场景

  • 当数据量较大,且希望比普通插入排序有更高的效率时,可以考虑使用希尔排序。
  • 在对稳定性有要求的排序场景中,希尔排序是一个较好的选择。

http://www.kler.cn/a/284187.html

相关文章:

  • Window下PHP安装最新sg11(php5.3-php8.3)
  • 【MySQL 保姆级教学】事务的隔离级别(详细)--下(13)
  • 除了 Mock.js,前端还有更方便的 Mock 数据工具吗?
  • 假期增设:福祉与负担并存,寻求生活经济平衡之道
  • 深度学习——权重初始化、评估指标、梯度消失和梯度爆炸
  • AI绘画经验(stable-diffusion)
  • 09:Logic软件原理图信号连通
  • LuaJit分析(九)LuaJit中的JIT原理分析
  • Codeforces Round 969 (Div. 2 ABCDE题) 视频讲解
  • 热门跨境平台的IP代理如何选择?入局IP知识
  • Python编写BC260Y TCP数据收发压力测试脚本
  • 创建SQLiteOpenHelper 类来创建和管理SQLite数据库
  • vue2踩坑记录:el-select如何绑定对象
  • 二叉树详解(2)
  • Ethercat设备数据 转IEC61850项目案例
  • zyx青岛实训day34 初步了解Docker与套接字的应用
  • 行为模式7.解释器模式------DSL语言
  • Linux动态库搜索路径相关知识文章
  • UE4 使用AndroidGameDevelopmentExtension(AGDE)对安卓客户端做“断点调试”与“代码热更”
  • Nginx代理MinIO界面
  • Vue.js入门系列(十八):利用浏览器本地存储实现TodoList数据持久化
  • 全国设计院排名 境外工程总承包营业额二〇二三年排名
  • 在 Deepin 系统中搭建 Node.js 开发环境
  • 【STM32】RTC
  • 打卡第60天------图论
  • OceanBase V4 技术解读:从Alter Table 看DDL的支持