希尔排序:优化的插入排序

简介: 希尔排序:优化的插入排序

希尔排序(Shell Sort)是一种插入排序的改进算法,它通过比较相距一定间隔的元素进行排序,逐步减小间隔,最终实现整体有序。本文将详细介绍希尔排序的工作原理,提供示例和Python、Go、Java以及C语言的实现代码。


希尔排序的基本思想


希尔排序的核心思想是将整个待排序序列分割成若干个子序列,分别对这些子序列进行插入排序,然后逐步减小子序列的间隔,直到间隔为1,最终对整个序列进行一次插入排序。这样,插入排序的效率会得到大幅提升。


具体步骤如下:

1.确定间隔序列: 选择一个间隔序列,一般是逐步减半,直到间隔为1。

2.间隔排序: 对间隔序列所对应的子序列进行插入排序。

3.逐步缩小间隔: 重复第二步,逐步减小间隔,直到间隔为1,完成最终的插入排序。


希尔排序的示例


让我们通过一个示例来理解希尔排序的工作原理。假设我们有一个整数数组 [12, 34, 54, 2, 3],我们希望按升序排序它。

1.选择间隔序列: 假设我们选择间隔序列为 [2, 1]。

2.间隔为2的排序: 分别对间隔为2的子序列进行插入排序。

第一轮:[12, 3]  [34, 2]  [54]


1.间隔为1的排序: 对整个序列进行一次插入排序。

第二轮:[3, 2, 12, 34, 54]


最终,我们得到了排序后的数组 [2, 3, 12, 34, 54]。


希尔排序的时间复杂度


希尔排序的时间复杂度取决于间隔序列的选择。一般来说,间隔序列的选择直接影响到希尔排序的性能。

1.最好情况时间复杂度: O(n log n)

2.平均情况时间复杂度: 取决于间隔序列

3.最坏情况时间复杂度: O(n^2)


希尔排序是一种不稳定的排序算法,适用于中等大小的数据集。它是插入排序的改进版本,通过减小元素移动的距离来提高排序效率。


示例代码


以下是希尔排序的示例代码,分别使用Python、Go、Java和C语言编写。

Python 希尔排序

def shell_sort(arr):
    n = len(arr)
    gap = n // 2
    
    while gap > 0:
        for i in range(gap, n):
            temp = arr[i]
            j = i
            while j >= gap and arr[j - gap] > temp:
                arr[j] = arr[j - gap]
                j -= gap
            arr[j] = temp
        gap //= 2
        
arr = [12, 34, 54, 2, 3]
shell_sort(arr)
print("排序后的数组:", arr)


Go 希尔排序

package main

import "fmt"

func shellSort(arr []int) {
  n := len(arr)
  gap := n / 2
  
  for gap > 0 {
  for i := gap; i < n; i++ {
    temp := arr[i]
    j := i
    
    for j >= gap && arr[j-gap] > temp {
    arr[j] = arr[j-gap]
    j -= gap
    }
    
    arr[j] = temp
  }
  
  gap /= 2
  }
}

func main() {
  arr := []int{12, 34, 54, 2, 3}
  shellSort(arr)
  fmt.Println("排序后的数组:", arr)
}


Java 希尔排序

import java.util.Arrays;

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 = i;
                
                while (j >= gap && arr[j - gap] > temp) {
                    arr[j] = arr[j - gap];
                    j -= gap;
                    
                }
                arr[j] = temp;
            }
            
            gap /= 2;
        }
    }
    
    public static void main(String[] args) {
        int arr[] = {12, 34, 54, 2, 3};
        shellSort(arr);
        System.out.print("排序后的数组: ");
        System.out.println(Arrays.toString(arr));
    }
}


C 语言 希尔排序

#include <stdio.h>

void shellSort(int arr[], int n) {
    int gap = n / 2;
    
    while (gap > 0) {
        for (int i = gap; i < n; i++) {
            int temp = arr[i];
            int j = i;
            
            while (j >= gap && arr[j - gap] > temp) {
                arr[j] = arr[j - gap];
                j -= gap;
            }
            
            arr[j] = temp;
        }
        
        gap /= 2;
    }
}

int main() {
    int arr[] = {12, 34, 54, 2, 3};
    int n = sizeof(arr) / sizeof(arr[0]);
    shellSort(arr, n);
    printf("排序后的数组: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}


以上示例代码展示了不同编程语言中的希尔排序算法实现。这些示例帮助你理解希尔排序的工作原理,并提供了可供参考和使用的代码示例。希尔排序是一种高效的排序算法,可以在大多数情况下获得不错的性能。

-

目录
相关文章
|
编译器 API C语言
深入探究Qt与C++标准的兼容之旅
深入探究Qt与C++标准的兼容之旅
1800 3
|
存储 Cloud Native 数据库
云原生之使用docker部署ZPan个人网盘系统
云原生之使用docker部署ZPan个人网盘系统
794 2
云原生之使用docker部署ZPan个人网盘系统
|
11月前
|
人工智能 运维 供应链
20个低代码开发平台多维度对比:解锁企业应用开发新动能
Gartner 报告指出,到 2024 年,低代码应用开发将占应用开发总数的 65%以上,将有 3/4 的大型企业会使用至少 4 个低代码平台进行 IT 应用开发。同时,市场研究机构的数据显示,在传统开发模式下,超过 70% 的企业项目存在开发周期延长的问题,平均延长时间达到原计划的 30%;约 80% 的企业表示在招募专业开发人才时面临困难;而面对个性化需求,近 90% 的企业认为传统开发响应速度慢,无法及时满足业务变化需求。这些数据充分表明,当前企业在应用开发上面临问题具有普遍性和严重性,低代码开发平台的兴起势在必行 ,其有望成为解决这些难题、推动企业数字化转型的关键力量。
1168 0
|
数据采集 自然语言处理 搜索推荐
Python内置函数ord()详解
`ord()` 是 Python 中用于将单个字符转换为对应 Unicode 码点的核心函数,支持 ASCII、多语言字符及特殊符号。其返回值为整数(范围 0-1114111),适用于字符编码验证、数据清洗、自定义排序、基础加解密等场景。使用时需注意参数长度必须为 1,否则会触发 `TypeError`。结合 `chr()` 函数可实现双向转换,进阶技巧包括多字节字符处理、编码范围检测及字符分类验证等。
|
10月前
|
人工智能 监控 JavaScript
CRM系统销售管理全流程解析:从MTL到RMS的数字化转型指南
在数字化转型浪潮下,CRM系统中的销售管理已成为企业增长的核心引擎。纷享销客以“全流程覆盖+智能化驱动+行业化适配”为核心,构建涵盖MTL、L2O、CPQ、RMS的端到端销售闭环,并深度融合AI技术,打造销售Agent生态,实现线索转化、客户洞察、报价履约等全场景智能赋能。通过MCR大客户管理体系,推动从短期成交向长期价值经营转型。其三层架构支持灵活定制与生态集成,已在智能制造、食品饮料、医疗健康等行业落地,助力神策数据、拓斯达、一舟股份等企业实现销售效率与战略协同的双重提升。未来,销售管理将迈向更智能、更协同、更个性化的新阶段,纷享销客持续以AI驱动企业可持续增长。
中断向量表的作用是什么?
【10月更文挑战第28天】中断向量表在计算机系统中扮演着至关重要的角色,它是实现中断处理、优先级管理、系统初始化以及硬件与软件交互的核心机制。通过中断向量表,计算机系统能够高效地响应各种中断事件,保证系统的稳定性、可靠性和实时性,为计算机的正常运行和各种应用程序的执行提供了有力支持。
1764 60
|
人工智能 安全 测试技术
探索AI在软件开发中的应用:提升开发效率与质量
【10月更文挑战第31天】在快速发展的科技时代,人工智能(AI)已成为软件开发领域的重要组成部分。本文探讨了AI在代码生成、缺陷预测、自动化测试、性能优化和CI/CD中的应用,以及这些应用如何提升开发效率和产品质量。同时,文章也讨论了数据隐私、模型可解释性和技术更新等挑战。
|
Web App开发 5G Linux
FFmpeg开发笔记(四十四)毕业设计可做的几个拉满颜值的音视频APP
一年一度的毕业季来临,计算机专业的毕业设计尤为重要,不仅关乎学业评价还积累实战经验。选择紧跟5G技术趋势的音视频APP作为课题极具吸引力。这里推荐三类应用:一是融合WebRTC技术实现视频通话的即时通信APP;二是具备在线直播功能的短视频分享平台,涉及RTMP/SRT等直播技术;三是具有自定义动画特效及卡拉OK歌词字幕功能的视频剪辑工具。这些项目不仅技术含量高,也符合市场需求,是毕业设计的理想选择。
595 6
FFmpeg开发笔记(四十四)毕业设计可做的几个拉满颜值的音视频APP
|
文字识别 UED Python
对双栏 | 单双栏混合 | 图表文字混合的复杂布局的图片OCR识别(对布局复杂的整个pdf进行OCR识别)
这个故事告诉我们要多尝试不同的库和引擎,尤其是需求比较偏门或者少见的时候。同一个方向不同的库所擅长的领域是不一样的。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
监控 安全 数据安全/隐私保护
Rootkit工作原理及其检测方法
【8月更文挑战第31天】
1551 0