C语言经典算法之希尔排序算法

目录

前言

一、代码实现

二、算法的时空复杂度

时间复杂度:

空间复杂度:


前言

建议:1.学习算法最重要的是理解算法的每一步,而不是记住算法。

           2.建议读者学习算法的时候,自己手动一步一步地运行算法。

tips:本算法是在直接排序算法的基础上拓展而来的,读者先将直接排序算法的逻辑理清之后更容易理解本算法。当然,也可以直接学习本算法。

希尔排序(Shell Sort)是一种插入排序的改进版本,其核心思想是通过逐步缩小数组的间隔,对子序列进行插入排序,最终实现对整个数组的排序。

一、代码实现

 
#include <stdio.h>// 希尔排序函数
void shellSort(int arr[], int n) {// 初始间隔设定为数组长度的一半for (int gap = n / 2; gap > 0; gap /= 2) {// 对每个子序列进行插入排序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;}}
}// 打印数组元素
void printArray(int arr[], int size) {for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");
}int main() {int arr[] = {12, 34, 54, 2, 3};int n = sizeof(arr) / sizeof(arr[0]);printf("原始数组: \n");printArray(arr, n);// 调用希尔排序算法shellSort(arr, n);printf("\n排序后的数组: \n");printArray(arr, n);return 0;
}

这段C代码中,shellSort函数实现了希尔排序算法,首先以一定的间隔(这里使用数组长度的一半)对数组进行分组,然后对每个子序列进行插入排序。随着排序的进行,不断缩小间隔,最终完成整个数组的排序。

main 函数中,我们创建一个简单的整数数组并调用 shellSort 函数进行排序,最后打印排序后的数组。希尔排序的优点在于相对于普通的插入排序,它在初始阶段就能够对数组的大部分乱序情况进行较快的修复,从而提高整体性能。

二、算法的时空复杂度

时间复杂度:

希尔排序(Shell Sort)是一种插入排序的改进版本,它通过逐步缩小子序列的间隔,对子序列进行插入排序,最终实现对整个数组的排序。希尔排序的时间复杂度与选取的间隔序列密切相关。

希尔排序的最坏时间复杂度取决于选用的间隔序列。一般而言,希尔排序的最坏时间复杂度为 O(n^2),这是由于在某些间隔下,对于逆序对的情况,插入排序需要多次移动元素,导致时间复杂度增加。

希尔排序的平均时间复杂度相对较难确定,因为它取决于选用的间隔序列。在平均情况下,希尔排序的时间复杂度可以达到 O(nlog 2 n)O(n^{4/3}),这比普通的插入排序 O(n^ 2 ) 要好很多。

希尔排序的优劣取决于选用的间隔序列,而不同的间隔序列可能导致不同的性能。目前还没有找到一种通用的最优间隔序列,因此在实践中,人们常常根据经验或问题特点来选择适合的间隔序列。希尔排序在某些特定场景下仍然是一个有效的排序算法,特别是对于中小规模数据。

空间复杂度:

希尔排序的空间复杂度是 O(1),即常数级别的额外空间。

tips:对于考研的小伙伴而言,希尔排序的时间复杂度一般不是重点内容

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

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

相关文章

创建React步骤

确保电脑已经安装了node.js以后&#xff0c;打开终端进入目标文件夹 cd xxx(文件夹 npx create-react-app react01(替换为你自己的react名称) 可能会出现是否安装xxx,输入y即可 没有报错信息后&#xff0c;输入 cd react01 npm start 会自动跳转到react界面&#xff0c;就…

AI新工具(20240118):AlphaGeometry解答国际数学奥林匹克竞赛中的几何问题

AlphaGeometry AlphaGeometry是由谷歌旗下的DeepMind团队开发的一款人工智能系统&#xff0c;它能够解决国际数学奥林匹克竞赛&#xff08;IMO&#xff09;的几何题。AlphaGeometry模型通过神经语言模型和符号推理引擎相结合的方式&#xff0c;实现了复杂的几何定理证明。该模…

基于改进凸优化算法的多机编队突防航迹规划

源自&#xff1a;系统工程与电子技术 作者&#xff1a;刘玉杰, 李樾, 韩维, 崔凯凯 “人工智能技术与咨询” 发布 摘要 为更好地发挥多机编队在低空突防作战中的优势, 对已有的凸优化算法进行改进, 提出一种多机编队低空突防航迹规划方法。首先, 根据低空突防任务特点进行…

今日腊八 | “粥”到,健康到

腊八节 一碗碗腊八粥被端上桌 扑鼻而来的香气 搅动着大家的味蕾 仔细一看 大米、小米、玉米 红枣、桂圆、花生 红豆、绿豆 …… 这个腊八节 我们一起喝腊八粥 品“腊八”诗 学健康之道 请点击海报中诗词查收健康提示 ▼ 腊八已至 年味渐浓 一碗祝福粥 愿您福长久…

2024年初级会计考试报名流程及证件照处理方法公布

2024年各地初级会计考试的报名活动正如火如荼地进行中&#xff0c;现已进入最后的冲刺阶段。对于那些渴望在会计领域取得专业资格的人士来说&#xff0c;这是一个不容错过的机会。错过这次报名&#xff0c;你将不得不等待整整一年才能再次尝试。为了帮助大家顺利通过审核&#…

linux-nfc neard 编译、安装与运行

项目github地址&#xff1a; https://github.com/linux-nfc/neard git clone地址&#xff1a; https://github.com/linux-nfc/neard.git 1.安装依赖库 clone完源码切换到目录neard里。这个项目需要依赖一下库&#xff1a; - GCC compiler - D-Bus library - GLib library …

如何搭建Z-blog网站并结合内网穿透实现无公网ip访问本地站点

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员&#xff0c;自己搭建网站制作网页是绕…

第5章 现代通信网

文章目录 5.1 通信网概述5.1.1 通信网的构成要素5.1.2 通信网的发展演进 5.2 交换与控制5.2.1 交换的基本概念1、电路交换2、报文交换3、分组交换4、3种交换技术的比较 5.2.2 IP交换1、IP交换机的构成2、IP 交换的工作原理 5.2.3 IP多媒体子系统 5.3 传输网 5.1 通信网概述 5.…

Verilog语法——4.Verilog工程模板、相应规范再强调

参考资料 【明德扬_verilog零基础入门语法HDL仿真快速掌握-手把手教你写FPGA/ASIC代码设计流程中的应用】 4. Verilog工程模板、相应规范 4.1 Verilog工程模板 4.1.1 设计模块模板 module module_name(clk,rst_n,//其他信号&#xff0c;举例doutdout };//参数定义parameter …

【测试开发】如何在团队中推广新工具,新技术?

前言 就测试开发工作而言&#xff0c;从阶段划分&#xff0c;可以粗略划分为四个阶段&#xff1a; 识别发现组织团队中的问题分析、制定解决方案实现解决方案赋能落地解决方案 今天我们重点来聊聊&#xff0c;最后一个阶段&#xff0c;赋能落地解决方案过程中的经验和思考。…

如何实现无公网ip远程访问内网本地BUG管理服务【内网穿透】

文章目录 前言1. 本地安装配置BUG管理系统2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射本地服务3. 测试公网远程访问4. 配置固定二级子域名4.1 保留一个二级子域名5.1 配置二级子域名6. 使用固定二级子域名远程 前言 BUG管理软件,作为软件测试工程师的必备工具之一。在…

11.云原生分布式数据库之TIDB

云原生专栏大纲 文章目录 为什么使用TIDB后端视角运维视角基础架构视角 TiDB Operator 简介软件版本要求部署tidbTIDB工具helm常用命令TIDB学习推荐资料 为什么使用TIDB 从后端视角、运维视角和基础架构视角来看&#xff0c;使用 TiDB 作为数据库系统可以获得分布式架构、高可…