十大排序算法之->希尔排序

一、希尔排序简介

希尔排序,也称为缩小增量排序,是由D.L. Shell于1959年提出的。它的核心思想是将整个待排序的记录序列分割成若干个子序列,这些子序列的元素是相隔一定“增量”的。然后对这些子序列分别进行直接插入排序。随着增量的逐步减小,进行排序的子序列会逐渐增大,直至包含所有元素。当增量减到1时,整个序列恰被分成一组,此时再进行一次直接插入排序,排序过程便结束。

希尔排序的时间复杂度与待排序数组的初始状态有关,最坏情况下时间复杂度为O(n^2),但在大多数情况下,其时间复杂度要优于直接插入排序。

操作过程:

  1. 分组:首先选取一个小于数组长度n的整数作为第一个增量d1,将所有距离为d1的倍数的元素放在同一组中。

  2. 直接插入排序:在每个分组内进行直接插入排序,此时每组都是相对独立的。

  3. 缩小增量:选择第二个增量d2(小于d1),重复上述的分组和排序过程。依次类推,每次选择的增量逐渐减小。

  4. 最终排序:当增量减小到1时,即所有元素都在一个组内,对全体元素进行最后一次直接插入排序以确保整个序列有序。

二、代码实现

# -*- coding: utf-8 -*-
"""
======================================
   File Name  : shell_sort.py
   Author     : lanmingyong
   date       : 2024/5/10 17:55
   Description: 希尔排序(Shell Sort)是插入排序的一种优化版本,也被称为缩小增量排序。它的基本思想是将待排序的数组元素按照一定的间隔分组,对每组进行直接插入排序,然后逐渐缩小间隔,再进行排序,直到间隔为1,此时整个序列已经基本有序,最后再进行一次直接插入排序。
希尔排序的时间复杂度与待排序数组的初始状态有关,最坏情况下时间复杂度为O(n^2),但在大多数情况下,其时间复杂度要优于直接插入排序。
=======================================
"""


def shell_sort(arr):
    gap = len(arr)//2
    while gap:
        for i in range(gap, len(arr)):
            index_1 = i
            for j in list(range(0, len(arr)))[i - gap::-gap]:
                if arr[index_1] < arr[j]:
                    arr[index_1], arr[j] = arr[j], arr[index_1]
                    index_1 = j
                    print("每移动一次后排序结果" + str(arr))
        print("分{num}分组排序结果".format(num=gap) + str(arr))
        gap = gap // 2
    return arr


arr = [9, 6, 7, 0, 8, 1, 0, 4, 3]
# arr = [89, 65, 21, 8, 76, 79, 0, 86, 51, 33, 34, 8, 76, 53, 93, 88, 65, 0, 92, 56, 76, 9, 0, 54, 9, 37, 94, 72, 92, 72, 88, 44, 34, 48, 14, 22, 76, 34, 45, 50, 66, 4, 77, 41, 64, 24, 65, 99, 16, 64]

print("排序结果:" + str(shell_sort(arr)))

# 执行输出
"""
每移动一次后排序结果[8, 6, 7, 0, 9, 1, 0, 4, 3]
每移动一次后排序结果[8, 1, 7, 0, 9, 6, 0, 4, 3]
每移动一次后排序结果[8, 1, 0, 0, 9, 6, 7, 4, 3]
每移动一次后排序结果[8, 1, 0, 0, 3, 6, 7, 4, 9]
每移动一次后排序结果[3, 1, 0, 0, 8, 6, 7, 4, 9]
分4分组排序结果[3, 1, 0, 0, 8, 6, 7, 4, 9]
每移动一次后排序结果[0, 1, 3, 0, 8, 6, 7, 4, 9]
每移动一次后排序结果[0, 0, 3, 1, 8, 6, 7, 4, 9]
每移动一次后排序结果[0, 0, 3, 1, 7, 6, 8, 4, 9]
每移动一次后排序结果[0, 0, 3, 1, 7, 4, 8, 6, 9]
分2分组排序结果[0, 0, 3, 1, 7, 4, 8, 6, 9]
每移动一次后排序结果[0, 0, 1, 3, 7, 4, 8, 6, 9]
每移动一次后排序结果[0, 0, 1, 3, 4, 7, 8, 6, 9]
每移动一次后排序结果[0, 0, 1, 3, 4, 7, 6, 8, 9]
每移动一次后排序结果[0, 0, 1, 3, 4, 6, 7, 8, 9]
分1分组排序结果[0, 0, 1, 3, 4, 6, 7, 8, 9]
排序结果:[0, 0, 1, 3, 4, 6, 7, 8, 9]
"""

:如果代码有错误欢迎指出交流,感谢!!

三、动画演示

图片

 欢迎大家关注我的订阅号,会定期分享一些关于测试相关的文章,有问题也欢迎一起讨论学习!
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Pycharm 执行pytest时,会遇见某些case Empty suite

我这边的情况是有些case就是执行不了&#xff0c;百度了很多&#xff0c;有说设置选pytest的&#xff0c;有命名规范的&#xff0c;都没有成功。后面问了同事之后才发现&#xff0c;pytest 的框架&#xff0c;pytest.ini 执行的时候&#xff0c;加了个标签&#xff0c;主动把某…

Linux 安装JDK和Idea

安装JDK 下载安装包 下载地址&#xff1a; Java Downloads | Oracle (1) 使用xshell 上传JDK到虚拟机 (2) 移动JDK 包到/opt/environment cd ~ cd /opt sudo mkdir environment # 在 /opt下创建一个environment文件夹 ls# 复制JDK包dao /opt/environment下 cd 下载 ls jd…

短信群发公司通道有哪些要求

短信群发公司通道有哪些要求 网络稳定性 短信群发公司的通道在进行时需要具备良好的网络稳定性。这意味着通道需要能够稳定连接到互联网&#xff0c;并具备高速传输能力。在网络不稳定或者传输速度慢的情况下&#xff0c;可能会受到影响&#xff0c;甚至导致失败。 高可靠性 …

【竞技宝】欧冠:欧洲三大赛事决赛对阵出炉

本赛季欧洲三级赛事的决赛对阵均已出炉:皇马与多特蒙德相聚欧冠决赛;勒沃库森将会和亚特兰大争夺欧联杯冠军;奥林匹亚科斯则要与佛罗伦萨争夺欧协联的冠军。在6支决赛球队中,德甲和意甲都有两支球队,而西甲的皇马则是夺冠最大热门,近几个赛季战斗力极强的英超在欧战方面彻底失败…

pydev debugger: process **** is connecting

目录 解决方案一解决方案二 1、调试时出现pydev debugger: process **** is connecting 解决方案一 File->settings->build,execution,deployment->python debugger 下面的attach to subprocess automatically while debugging取消前面的勾选&#xff08;默认状态为勾…

python之并发编程

python之并发编程 线程的创建方式线程的创建方式(方法包装)线程的创建方式(类包装)join()【让主线程等待子线程结束】守护线程【主线程结束&#xff0c;子线程就结束】 锁多线程操作同一个对象(未使用线程同步)多线程操作同一个对象(增加互斥锁&#xff0c;使用线程同步)死锁案…

多线程-写入读取文件,使用同步逻辑

在一个进程中&#xff0c;创建一个子线程。 主线程负责:向文件中写入数据 子线程负责:从文件中读取数据 要求使用线程的同步逻辑&#xff0c;保证一定在主线程向文件中写入数据成功之后&#xff0c;子线程才开始运行&#xff0c;去读取文件中的数据 #include <stdio.h> …

(2024,SD,条件 GAN,蒸馏,噪声到图像翻译,E-LatentLPIPS)将扩散模型蒸馏为条件 GAN

Distilling Diffusion Models into Conditional GANs 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 方法 3.1 用于一步生成的配对的噪声到图像翻译 3.2 用于潜在空间蒸馏…

Android 按钮Button点击音效

一、新建工程 编译运行&#xff0c;确保工程无误&#xff0c;这里不过多赘述。 二、UI布局 添加两个播放音效Button <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"…

eclipse创建web项目

前言&#xff1a;我是第一次写web项目&#xff0c;探索了很多天&#xff0c;今天就把我知道的分享给大家&#xff0c;希望大家能够少走弯路&#xff0c;早点写出属于自己的web项目。完成课程设计或毕业设计。 一.准备工作 首先&#xff0c;在这里推荐一个网站--菜鸟教程。这个…

知识图谱:人工智能的“核心驱动力”

知识图谱&#xff1a;人工智能的“核心驱动力” 一、人工智能与知识图谱二、知识图谱的定义与重要性三、知识图谱工程师的薪资情况四、知识图谱的应用领域六、知识图谱的未来展望七、总结 一、人工智能与知识图谱 人工智能&#xff08;AI&#xff09;作为21世纪的前沿技术&…

Hive Windows Functions 窗口函数

Hive Windows Functions 窗口函数 在 Hive 中&#xff0c;窗口函数&#xff08;Window Functions&#xff09;用于在查询结果中执行聚合、排序和分析操作&#xff0c;而无需将数据分组。窗口函数允许你在查询结果中的一组行上执行计算&#xff0c;而不会改变原始数据的行数&am…

信息系统架构模型_1.单机应用模式和客户机/服务器模式

1.单机应用模式&#xff08;Standalone&#xff09; 单机应用系统是最简单的软件结构&#xff0c;是指运行在一台物理机器上的独立应用程序。这些软件系统&#xff0c;从今天的软件架构上来讲&#xff0c;是很简单&#xff0c;是标准的单机系统。当然至今&#xff0c;这种复杂的…

岩点×数说故事×小红书 | 发布《中国攀岩行业分析报告》

从下班健身到下班攀岩&#xff0c;从“鸡娃”到岩馆“溜娃”&#xff0c;被奥运“正名”的攀岩运动&#xff0c;在国内熬过了萌芽阶段&#xff0c;悄然开出了花。2023年&#xff0c;各类重磅攀岩赛事重启、线下岩馆疯狂扩张&#xff0c;小众攀岩正式进入大众视野&#xff0c;风…

【系统架构师】-案例篇(七)信息安全

某软件公司拟开发一套信息安全支撑平台&#xff0c;为客户的局域网业务环境提供信息安全保护。该支撑平台的主要需求如下&#xff1a; 1.为局域网业务环境提供用户身份鉴别与资源访问授权功能&#xff1b; 2.为局域网环境中交换的网络数据提供加密保护&#xff1b; 3.为服务…

CAPL如何实现TLS握手认证

CAPL有专门的章节介绍如何实现TLS握手认证的函数: CAPL调用哪些函数实现TLS握手认证,需要了解TLS在整个通信过程的哪个阶段。 首先TCP需要建立连接,这是TLS握手的前提。当TLS握手认证完成后,可以传输数据。 所以TLS握手开始前需要确保TCP建立连接,TCP传输数据前需要确保…

【软考高项】三十九、采购管理

一、管理基础 项目采购管理包括从项目团队外部采购或获取所需产品、服务或成果的各个过程。例如合同、订购单、协议备忘录(MOA)和服务水平协议&#xff08;SLA)。被授权采购项目所需货物、服务的人员可以是项目团队、管理层或组织采购部的成员 协议可以是合同、服务水平协议(S…

通用型产品发布解决方案(后端环境搭建)

文章目录 后端renren脚手架配置1.解压后放到项目目录下2.新建商品模块1.创建一个新模块 sunliving-commodity2.删除两个不必要的文件3.pom.xml 引入依赖 3.maven进行聚合管理1.将刚才配置的pom.xml文件复制到父项目下并进行修改2.手动将这个pom.xml加入项目&#xff08;如果右下…

Python专题:十、字典(2)

字典定义x{} get()函数 get&#xff08;参数一&#xff0c;参数二&#xff09; 参数一&#xff1a; 需要查找的关键词 参数二&#xff1a; 如果关键词不存在get返回的默认值 字典的更新 update&#xff08;&#xff09;函数&#xff0c;字典y的元素&#xff0c;去更新字…

景联文科技:用高质量数据采集标注赋能无人机技术,引领无人机迈入新纪元!

随着无人机技术的不断发展与革新&#xff0c;它已成为现代社会中一个前景无限的科技领域。 无人机应用领域 边境巡逻与安防&#xff1a;边境管理部门利用无人机监控边境线&#xff0c;防止非法越境和其他安全威胁&#xff0c;同时也能监控地面安保人员的工作状态和行动路线。 …