希尔排序——C语言andPython

前言

步骤

代码

C语言

 Python

总结


前言

希尔排序(Shell Sort)是一种改进的插入排序算法,它通过将数组分成多个子序列进行排序,逐步减小子序列的长度,最终完成整个数组的排序。希尔排序的核心思想是通过排序较远距离的元素来使数组局部有序,从而减少后续插入排序的工作量。

虽然使用了三重循环,但由于希尔排序的特殊设计,其速度处于佼佼者的地位,不过并不稳定,指相等数字的前后关系变化。


步骤

  1. 选择一个增量序列,通常是使用 Knuth 提出的增量序列(3^k - 1)/ 2 其中 k 为递减的整数序列(或增量为数组长度累次除以2) 。
  2. 对于每个增量,从增量开始,将数组划分为多个较小的子序列。
  3. 对每个子序列进行插入排序。即,对于子序列中的每个元素,与同一子序列中对应位置的前一个元素进行比较,如果需要,则交换它们的位置。
  4. 不断缩小增量,重复步骤 2 和 3,直到增量为 1。
  5. 最后再进行一次完整的插入排序,此时数组已经基本有序,插入排序的工作量会大大减少。

举例子 

将[1,5,3,8,9,6,5,10,12]变为增序

代码

C语言

#include <stdio.h>void shellSort(int arr[], int n) {int gap, i, j, temp;// 选择初始增量for (gap = n / 2; gap > 0; gap /= 2) {for (i = gap; i < n; i++) {temp = arr[i];// 对子序列进行插入排序for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {arr[j] = arr[j - gap];}arr[j] = temp;}}
}// 示例
int main() {int arr[] = {9, 5, 1, 8, 3, 7, 4, 6, 2};int n = sizeof(arr) / sizeof(arr[0]);shellSort(arr, n);printf("排序后的数组:");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}return 0;
}

 Python

def shell_sort(arr):n = len(arr)gap = n // 2  # 初始增量while gap > 0:for i in range(gap, n):temp = arr[i]j = iwhile j >= gap and arr[j - gap] > temp:arr[j] = arr[j - gap]j -= gaparr[j] = tempgap //= 2  # 缩小增量# 示例
my_list = [9, 5, 1, 8, 3, 7, 4, 6, 2]
shell_sort(my_list)
print(my_list)
# 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9]

总结

相对于传统的插入排序,希尔排序通过提前部分排序,可以有效地减少比较和交换的次数,从而提高算法的效率。希尔排序的时间复杂度取决于增量序列的选择,但通常情况下介于 O(n) 和 O(n^2) 之间。

需要注意的是,希尔排序是一种不稳定的排序算法,即相等元素的相对顺序有可能在排序过程中发生改变。

总体而言,希尔排序在实践中具有较高的性能表现,尤其适用于中等大小的数组排序。

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爬虫学习记录(持续更新)

一、问题记录 1.使用webdriver报错AttributeError: str object has no attribute capabilities 解决&#xff1a;目前使用的selenium版本是4.11.2&#xff0c;可以不必设置driver.exe的路径&#xff0c;selenium可以自己处理浏览器和驱动程序&#xff0c;因此&#xff0c;使用…

Delphi7通过VB6之COM对象调用PowerBASIC写的DLL功能

Delphi7通过VB6之COM对象调用PowerBASIC写的DLL功能。标题挺长&#xff0c;其实目标很简单&#xff0c;就是在Delphi7中使用PowerBASIC的MKI/CVI, MKS/CVS, MKD/CVD&#xff0c;并顺便加入CRC16检验函数&#xff0c;再进行16进制高低字节调整&#xff0c;方便在VB6、Delphi、La…

Linux配置QT Creator环境:ubuntu中安装QT Creator环境

一、前景 目前市面上很多公司使用QT Creator进行界面开发&#xff0c;基本都会选择在Linux环境进行&#xff0c;优点不仅是市场所需&#xff0c;更是方便后期代码的移植&#xff0c;相较于Windows系统&#xff0c;Linux系统移植性非常好。故此篇文章&#xff0c;介绍如何在Linu…

【EI/SCOPUS检索】第三届新媒体发展与现代化教育国际学术会议(NMDME 2023)

第三届新媒体发展与现代化教育国际学术会议&#xff08;NMDME 2023&#xff09; The 3rd International Conference on New Media Development and Modernized Education 第三届新媒体发展与现代化教育国际学术会议(NMDME 2023)将于2023年10月13-15日于西安召开。会议旨在为新…

FPGA_时钟显示(时钟可调)

1. 实验说明 在数码管显示数据的基础上&#xff0c;让六位数码管显示数字时钟&#xff0c;并且通过按键可以对时间进行修改。 实验目标&#xff1a;六位数码管分别显示时间的时分秒&#xff0c;且通过按键可实现加减调整时间及清零功能。 key1: 切换键&#xff1a;选择待…

lancet: 【推荐】--源码学习

一个全面、高效、可复用的go语言工具函数库&#xff1b; 可以学习源码的好的地方&#xff0c;这个是个工具库&#xff0c;建议最好的办法是 在项目中导入后&#xff0c;然后查看他的各个源代码进行学习使用 golangd中&#xff0c;查看导入包以及他的源代码&#xff1b; 中文…

Telerik UI for ASP.NET Core Crack

Telerik UI for ASP.NET Core Crack Telerik ASP.NET Core还包括MVC和Kendo UI捆绑包(用于JavaScript)、Figma的设计工具包以及文档处理库、用于ASP.NET Core的Telerik REPL、RTL支持、辅助功能和键盘导航、主题化、虚拟课堂培训、详细文档、演示、KBs和世界级支持。使用一整套…

接口幂等性实现方式

优质博文&#xff1a;IT-BLOG-CN 幂等 操作的特点是一次和多次请求某一个资源对于资源本身应该具有同样的结果&#xff08;网络超时等问题除外&#xff09;。幂等函数或幂等方法是指可以使用相同参数重复执行&#xff0c;并能获得相同结果的函数。这些函数不会影响系统状态&am…

【云原生】Docker 详解(一):从虚拟机到容器

Docker 详解&#xff08;一&#xff09;&#xff1a;从虚拟机到容器 1.虚拟化 要解释清楚 Docker&#xff0c;首先要解释清楚 容器&#xff08;Container&#xff09;的概念。要解释容器的话&#xff0c;就需要从操作系统说起。操作系统太底层&#xff0c;细说的话一两本书都说…

科技引领,教育革新|EasyV助力数字孪生智慧教育建设!

数字孪生校园是以物联网、大数据、云计算、人工智能、三维可视化等新型数字化技术为基础&#xff0c;构建的数智校园的“大脑”。对校园的人、车、资产设施、各业务系统进行全联接&#xff0c;实现数据全融合、状态全可视、业务全可管、事件全可控&#xff0c;使校园更安全、更…

Observable设计模式简介

Observable设计模式存在于许多Java API和响应式编程中。下面介绍Java中永恒的Observable模式。 Observable设计模式用于许多重要的Java API。一个众所周知的示例是使用ActionListenerAPI执行操作的JButton。在这个例子中&#xff0c;我们ActionListener在按钮上进行了监听或…

【大数据】Flink 详解(二):核心篇 Ⅱ

Flink 详解&#xff08;二&#xff09;&#xff1a;核心篇 Ⅱ 22、刚才提到 State&#xff0c;那你简单说一下什么是 State。 在 Flink 中&#xff0c;状态 被称作 state&#xff0c;是用来保存中间的计算结果或者缓存数据。根据状态是否需要保存中间结果&#xff0c;分为 无状…