【希尔排序算法】详解:原理、实现与优化

【希尔排序算法】详解:原理、实现与优化

【希尔排序算法】详解:原理、实现与优化

🌺The Begin🌺点点关注,收藏不迷路🌺

一、算法概述

希尔排序(Shell Sort)是Donald Shell于1959年提出的一种改进的插入排序算法,又称缩小增量排序。它通过将原始数组分解为若干个子序列进行插入排序,随着增量逐渐减小,最终对整个数组进行一次插入排序。

基本特性

  • 时间复杂度:取决于增量序列,通常为O(n^(1.3-2))
  • 空间复杂度:O(1)(原地排序)
  • 稳定性:不稳定排序算法
  • 适用场景:中等规模数据,特别是部分有序的数据

二、算法原理详解

核心思想

  1. 分组插入排序:按照增量gap将数组分为若干子序列
  2. 逐步缩小增量:每次缩小gap值,直到gap=1
  3. 最终插入排序:当gap=1时,就是标准的插入排序

增量序列选择

常用的增量序列:

  • Shell原始序列:gap = n/2, n/4, …, 1
  • Hibbard序列:1, 3, 7, …, 2^k-1
  • Sedgewick序列:1, 5, 19, 41, 109,…

三、算法流程图示

示例数组:[8, 9, 1, 7, 2, 3, 5, 4, 6, 0]

初始状态
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ 8 │ 9 │ 1 │ 7 │ 2 │ 3 │ 5 │ 4 │ 6 │ 0 │ └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘ 
第一轮:gap=5

将数组分为5组:(8,3), (9,5), (1,4), (7,6), (2,0)

分组示意图: ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ 8 │ │ │ │ │ 3 │ │ │ │ │ → (8,3) │ │ 9 │ │ │ │ │ 5 │ │ │ │ → (9,5) │ │ │ 1 │ │ │ │ │ 4 │ │ │ → (1,4) │ │ │ │ 7 │ │ │ │ │ 6 │ │ → (7,6) │ │ │ │ │ 2 │ │ │ │ │ 0 │ → (2,0) └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘ 排序后结果: ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ 3 │ 5 │ 1 │ 6 │ 0 │ 8 │ 9 │ 4 │ 7 │ 2 │ └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘ 
第二轮:gap=2

将数组分为2组:
(3,1,0,9,7), (5,6,8,4,2)

分组示意图: ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ 3 │ │ 1 │ │ 0 │ │ 9 │ │ 7 │ │ → (3,1,0,9,7) │ │ 5 │ │ 6 │ │ 8 │ │ 4 │ │ 2 │ → (5,6,8,4,2) └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘ 排序后结果: ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ 0 │ 2 │ 1 │ 4 │ 3 │ 5 │ 7 │ 6 │ 9 │ 8 │ └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘ 
第三轮:gap=1(标准插入排序)
最终排序结果: ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ └───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘ 

四、完整Java实现

packagecom.kwan.springbootkwan.controller;publicclassShellSort{/** * 基础希尔排序(使用Shell原始增量序列) * @param arr 待排序数组 */publicstaticvoidshellSort(int[] arr){if(arr ==null|| arr.length <=1){return;}int n = arr.length;// 初始gap为数组长度的一半,逐步缩小gap直到1for(int gap = n /2; gap >0; gap /=2){// 从第gap个元素开始,对各个子序列进行插入排序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;}}}// 测试代码publicstaticvoidmain(String[] args){int[] arr ={8,9,1,7,2,3,5,4,6,0};System.out.println("原始数组:");printArray(arr);System.out.println("\n希尔排序后:");shellSort(arr);printArray(arr);}// 打印数组privatestaticvoidprintArray(int[] arr){for(int num : arr){System.out.print(num +" ");}System.out.println();}}
在这里插入图片描述

五、算法分析

时间复杂度分析

希尔排序的时间复杂度取决于增量序列的选择

增量序列最坏时间复杂度平均时间复杂度
Shell原始序列O(n²)O(n^(1.5))
Hibbard序列O(n^(3/2))O(n^(5/4))
Sedgewick序列O(n^(4/3))O(n^(7/6))

空间复杂度

  • 只需要常数级别的额外空间
  • 空间复杂度:O(1)

稳定性

希尔排序是不稳定的排序算法,因为相同的元素可能会被分到不同的子序列中,导致相对顺序改变。

六、实际应用场景

  1. 中等规模数据排序:当数据量在几千到几万时,希尔排序表现良好
  2. 嵌入式系统:由于空间复杂度低,适合资源受限的环境
  3. 作为更复杂算法的预处理步骤:可以先使用希尔排序进行部分排序

七、与其他排序算法的对比

算法平均时间复杂度最坏时间复杂度空间复杂度稳定性
希尔排序O(n^(1.3-2))O(n²)O(1)不稳定
插入排序O(n²)O(n²)O(1)稳定
快速排序O(nlogn)O(n²)O(logn)不稳定
归并排序O(nlogn)O(nlogn)O(n)稳定

八、总结

希尔排序通过分组插入排序的思想,有效减少了数据移动的次数,是对简单插入排序的重要改进。虽然其时间复杂度理论分析较为复杂,但在实际应用中,特别是中等规模数据的排序场景下,希尔排序往往能提供不错的性能表现。

选择合适的增量序列对希尔排序的性能至关重要,Hibbard序列和Sedgewick序列在实践中表现良好。希尔排序的实现简单,空间效率高,是值得掌握的经典排序算法之一。

在这里插入图片描述

🌺The End🌺点点关注,收藏不迷路🌺

Read more

在 WSL 中通过 VSCode/Cursor+Cond 虚拟环境运行 Python 代码 全教程

在 WSL 中通过 VSCode/Cursor+Cond 虚拟环境运行 Python 代码 全教程 本文基于你已安装 WSL的前提,重点讲解「WSL 中安装 Miniconda→创建 Python 虚拟环境→VSCode/Cursor 连接 WSL 并使用 conda 环境运行代码」的完整流程,步骤精准可落地。 一、核心前提 * 已启用 WSL2(Ubuntu/Debian 等发行版),且能正常启动终端; * Windows 端已安装 VSCode/Cursor(建议最新版本); * 网络通畅(需下载 Miniconda 和 Python 包)。 二、步骤 1:

By Ne0inhk
Python 流程控制完全指南:条件语句 + 循环语句 + 实战案例(零基础入门)

Python 流程控制完全指南:条件语句 + 循环语句 + 实战案例(零基础入门)

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 一. 顺序语句:基础执行语句 * 二. 条件语句:实现 “如果… 否则…” 逻辑 * 2.1 核心语法格式 * 2.2 关键注意点 * 2.3 空语句 pass:占位符作用 * 2.4 练习题 * 三. 循环语句:实现 “重复执行” 逻辑 * 3.1 while 循环:条件满足就一直执行 * 3.2 for 循环:

By Ne0inhk

【Python】6 种方法轻松将 Python 脚本打包成 EXE 应用

以下是 2025–2026 年最实用的 6 种 Python 脚本打包成 Windows EXE 可执行文件 的主流方法,按易用性 × 普及度 × 实际场景排序。 排名方法/工具易用性生成文件大小启动速度运行速度反编译难度典型场景推荐指数 (★5)1PyInstaller★★★★★大(onefile 常 50–300MB)慢(几秒~几十秒)普通低绝大多数 GUI、小工具、初次尝试★★★★★2auto-py-to-exe★★★★★同 PyInstaller同上普通低零基础用户、GUI 操作打包★★★★☆3Nuitka★★★★☆中~小快明显更快(1.5–4×)中~高性能敏感、数值计算、想保护代码★★★★☆4cx_Freeze★★★★中较快普通低~中追求启动快、

By Ne0inhk

如何在 Mac 上安装 Python

所有最新的 MacOS(从 macOS 12.3 开始)都预装了 Python 版本(通常是 Python 2.x),但它已经过时并且不再受支持。要充分利用 Python 的功能,您需要安装 最新版本的 Python 。 本文提供了 分步教程 ,展示了 在 macOS (MacBook 旧版本和新版本,如 M1、M2、M3 或 M4)上安装和更新 Python 的所有有效方法,从检查预安装版本到下载和更新最新的 Python 并设置基本工具(如 IDE 和 包管理器) ,本指南将帮助您轻松地在任何 MacBook 设备上安装 Python。 先决条件 正在运行MacOS的笔记本电脑。

By Ne0inhk