🔥个人主页:@草莓熊Lotso

🎬作者简介:C++研发方向学习者

📖个人专栏: 《C语言》 《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》

⭐️人生格言:生活是默默的坚持,毅力是永久的享受。

前言:在前面的学习中,我们实现了顺序表和链表,栈和队列以及二叉树。通过这些知识的学习和实现我们的代码能力也有了一定的提升。那么我们从这篇博客开始就进入到了初阶数据结构最后一个板块,排序的学习。我们会学习多种排序,其实每种排序单独拿出来都不会很难。但是如果让我们自己去实现的话就不是那么容易的了。还是和之前一样,我们先分部分来讲解。


目录

一.排序的概念及应用 

 常见的排序算法:

二.直接插入排序

代码实现: 

时间复杂度: 

三.希尔排序

代码实现:

时间复杂度:

四.直接插入排序和希尔排序的性能对比

代码演示:


一.排序的概念及应用 

排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减排列起来的操作。

--我们在日常生活中经常可以见到排序的使用,比如购物平台的筛选排序,还有各种各样的排行榜

 常见的排序算法:

--如图所示


二.直接插入排序

基本思想:直接插入排序是一种简单的插入排序法,其基本思想是把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的序列中,直到所有的记录插入完为止,最后得到一个新的有序序列。

--我们在实际生活中玩扑克牌时,就用了插入排序的思想

直接插入排序的特性:元素集合越接近有序,直接插入排序算法的时间效率越高

代码实现: 

void InsertSort(int* arr, int n)
{for (int i = 0; i < n - 1; i++){int end = i;int tmp = arr[end + 1];while (end >= 0){//升序:>   降序:<if (arr[end] > tmp){arr[end + 1] = arr[end];end--;}else {break;}}arr[end + 1] = tmp;}
}

图示如下: 

test.c: 

#include"Sort.h"void PrintArr(int* arr, int n)
{for (int i = 0; i < n; i++){printf("%d ", arr[i]);}printf("\n");
}void test1()
{int a[] = { 5, 3, 9, 6, 2, 4, 7, 1, 8 };int size = sizeof(a) / sizeof(a[0]);printf("排序前:");PrintArr(a, size);//直接插入排序InsertSort(a, size);printf("排序后:");PrintArr(a, size);
}int main()
{test1();return 0;
}

--测试完成,打印没有问题,排成了升序,退出码为0

时间复杂度: 

  • O(n^2)


三.希尔排序

基本思想:希尔排序(Shell Sort)是一种改进的插入排序算法,其核心思想是通过将数组分割成若干个“子序列”逐步缩小排序范围,最终实现整体有序。

--先选定⼀个整数(通常是gap = n/3+1),把待排序文件所有记录分成各组,所有的距离相等的记录分在同一组内,并对每⼀组内的记录进行排序,然后gap=gap/3+1得到下⼀个整数,再将数组分成各组,进行插入排序,当gap=1时,就相当于直接插入排序。

希尔排序的特性:

  • 希尔排序是对直接插入排序的优化。
  • gap > 1 时都是预排序,目的是让数组更接近于有序。当 gap == 1 时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。

代码实现:

void ShellSort(int* arr, int n)
{int gap = n;while(gap>1){ gap = gap / 3 + 1;for (int i = 0; i < n - gap; i++)//用i++比用i+=gap省了一个循环{int end = i;int tmp = arr[end + gap];while (end >= 0){//升序:>   降序:<if (arr[end] > tmp){arr[end + gap] = arr[end];end -= gap;}else {break;}}arr[end + gap] = tmp;}}
}

图示如下: 

为啥要用gap=gap/3-1:

test.c: 

#include"Sort.h"void PrintArr(int* arr, int n)
{for (int i = 0; i < n; i++){printf("%d ", arr[i]);}printf("\n");
}void test1()
{int a[] = { 5, 3, 9, 6, 2, 4, 7, 1, 8 };int size = sizeof(a) / sizeof(a[0]);printf("排序前:");PrintArr(a, size);//希尔排序ShellSort(a, size);printf("排序后:");PrintArr(a, size);
}int main()
{test1();return 0;
}

--测试完成,打印没有问题,升序排列正确,退出码为0

时间复杂度:

  • O(n^1.3)


四.直接插入排序和希尔排序的性能对比

--除了通过时间复杂度以外,我们也可以通过下面这串代码来实现两种排序的性能对比

代码演示:

#include"Sort.h"void PrintArr(int* arr, int n)
{for (int i = 0; i < n; i++){printf("%d ", arr[i]);}printf("\n");
}void test1()
{int a[] = { 5, 3, 9, 6, 2, 4, 7, 1, 8 };int size = sizeof(a) / sizeof(a[0]);printf("排序前:");PrintArr(a, size);//直接插入排序//InsertSort(a, size);//希尔排序ShellSort(a, size);printf("排序后:");PrintArr(a, size);
}// 测试排序的性能对比
void TestOP()
{srand(time(0));const int N = 100000;int* a1 = (int*)malloc(sizeof(int) * N);int* a2 = (int*)malloc(sizeof(int) * N);for (int i = 0; i < N; ++i){a1[i] = rand();a2[i] = a1[i];}int begin1 = clock();InsertSort(a1, N);int end1 = clock();int begin2 = clock();ShellSort(a2, N);int end2 = clock();printf("InsertSort:%d\n", end1 - begin1);printf("ShellSort:%d\n", end2 - begin2);free(a1);free(a2);
}int main()
{TestOP();//test1();return 0;
}

--测试完成,可以看出10w个数据排序,希尔排序的用时比直接插入排序少很多(单位:ms)


往期回顾:

【数据结构初阶】--二叉树(四)

【数据结构初阶】--二叉树(五)

【数据结构初阶】--二叉树(六)

结语:本篇博客就到此结束了,主要实现了一下两种插入排序,一个直接插入排序,一个希尔排序。我们通过对比可知希尔排序大部分情况下都是优于直接插入排序的。这里声明一下,博主这里展示的都是Sort.c文件和test.c文件,其中.h文件由于比较简单这里就不展示了,大家可以直接看图片。如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持。

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

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

相关文章

Hive SQL (HQL) 编辑指南

Hive SQL&#xff08;HQL&#xff09;是基于Hive的数据仓库查询语言&#xff0c;语法类似标准SQL&#xff0c;但因Hive的离线大数据处理特性&#xff0c;存在一些特有规则和最佳实践。以下是Hive SQL的编辑指南&#xff0c;涵盖核心语法、注意事项和优化技巧&#xff1a; 一、H…

力扣热题100--------240.搜索二维矩阵

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1&#xff1a;输入&#xff1a;matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24…

【pytest高阶】-2- 内置hook插件扩展机制和定制开发

一、可爱版 pytest 插件 & hook 知识大礼包 &#x1f381;准备好和 pytest 插件来一场可爱约会了吗&#xff5e; 咱们用超甜的 emoji 把知识串成棉花糖&#x1f361; 一口一个知识点&#xff01;一、 pytest 插件&#xff1a;框架的 “魔法百宝箱” &#x1f9d9;‍♀️1. …

博创软件数智通OA平台:高效协同,安全办公新选择

在数字化转型浪潮下&#xff0c;企业对于办公自动化系统的需求日益迫切。博创软件&#xff0c;作为协同办公领域的佼佼者&#xff0c;凭借其卓越的技术实力和丰富的行业经验&#xff0c;推出了数智通OA平台&#xff0c;为企业提供了一个高效、安全、便捷的办公解决方案。博创软…

AI coding汇总持续更新

代码编辑器 当然了&#xff0c;用代码编辑器这个概念太泛了&#xff0c;更多的是指AI代码编辑器&#xff0c;有自动补全&#xff0c;ai写代码功能的产品。 cursor WindSurf Trae jetbrains全家桶 比如&#xff1a;IntelliJ IDEA虽然很优秀&#xff0c;但是有种感觉&#xff0c;…

Yolo底层原理学习--(第二篇)

一&#xff0c;IOU置信度与非极大值抑制NMS在第一篇文章中我们讲到&#xff0c;对于一张图片&#xff0c;在前向传播的过程后&#xff08;也就是卷积&#xff0c;池化&#xff0c;全连接等等&#xff09;&#xff0c;会生成许许多多个预测框&#xff0c;那么怎么从这么多预测框…

国内短剧CSP系统开发:技术架构与合规实践全解析

一、行业背景与政策驱动2025年&#xff0c;中国网络微短剧行业迎来法治化转型的关键期。国家广播电视总局《关于进一步统筹发展和安全促进网络微短剧行业健康繁荣发展的通知》明确实施"分类分层审核"制度&#xff0c;将微短剧划分为重点微短剧&#xff08;投资≥100万…

http请求访问响应慢问题解决的基本思路

一、明确问题现象&#xff1a;先确定 “慢” 的特征在排查前&#xff0c;需先收集基础信息&#xff0c;缩小问题范围&#xff1a;是否所有请求都慢&#xff1f; 还是仅特定接口&#xff08;如带数据库操作的接口&#xff09;、特定时间段&#xff08;如高峰期&#xff09;、特定…

Vue.js的核心概念

Vue.js的核心概念可归纳为以下关键点&#xff0c;结合最新技术演进与实践场景&#xff1a;一、响应式数据绑定‌双向绑定机制‌&#xff1a;通过Object.defineProperty&#xff08;Vue 2&#xff09;或Proxy&#xff08;Vue 3&#xff09;实现数据劫持&#xff0c;自动追踪依赖…

新手小白做一个简单的微服务

我不太懂微服务框架&#xff0c;自己跟了个视频尝试做一套简单的微服务框架&#xff0c;跟着做的时候&#xff0c;发现这个视频很适合初学者 https://www.bilibili.com/video/BV1684y1T7oW/?spm_id_from333.337.search-card.all.click&vd_source61882010e50d6b158eb87c148…

C语言笔记4:错题整理

#1.1 编程题 判断101-500之间有多少个素数&#xff0c;放入数组中&#xff0c;遍历数组输出所有素数&#xff0c; 素数&#xff1a; 除了1和它本身以外不再有其他的因数。 具体实现 就用DeepSeek了 以下是AI生成代码&#xff1a; #include <stdio.h> #include <math.h…

Mysql join语句

join 语句用于实现多表查询。 Index Nested-Loop Join select * from a join b on a.idb.id。对于两张表 a 和 b&#xff0c;Mysql 优化器会选择其中一张表执行全表扫描&#xff0c;称为驱动表。对于驱动表每一数据行&#xff0c;在被驱动表查询数据&#xff0c;将结果组合返回…

Spring AI 系列之三十 - Spring AI Alibaba-其它模型

之前做个几个大模型的应用&#xff0c;都是使用Python语言&#xff0c;后来有一个项目使用了Java&#xff0c;并使用了Spring AI框架。随着Spring AI不断地完善&#xff0c;最近它发布了1.0正式版&#xff0c;意味着它已经能很好的作为企业级生产环境的使用。对于Java开发者来说…

【Flutter3.8x】flutter从入门到实战基础教程(五):Material Icons图标的使用

flutter给我们内置准备了很多图标&#xff0c;这些图标可以使我们在没有设计师的前提下&#xff0c;也能做出自己满意的app icon网站 https://material.io/tools/icons/进入网站后&#xff0c;点击我们需要的图标&#xff0c;然后滑动找到flutter的tab选项&#xff0c;就可以看…

算法训练营day38 动态规划⑥ 322. 零钱兑换、279.完全平方数、139.单词拆分、多重背包

动态规划的第六篇&#xff01;背包问题总结篇&#xff01; 322. 零钱兑换 题目中说每种硬币的数量是无限的&#xff0c;可以看出是典型的完全背包问题。但是如何找最小的“组合”呢&#xff1f;&#xff08;通过dp数组的不同定义 与 递推公式&#xff09; 确定dp数组以及下标的…

vue+element 实现下拉框共享options

背景 用户的需求总是多样的&#xff0c;这不用户想做个下拉连选&#xff0c;每选一个基金&#xff0c;下方表格多一行&#xff0c;选择对应的重要性&#xff0c;任务&#xff1b;问题 其他都好弄&#xff0c;任务是远程搜索&#xff0c;选择人的单选下拉&#xff0c;如果每个下…

centos服务器安装minio

1.创建目录和下载文件 #创建相关文件夹 mkdir -p /home/minio mkdir -p /home/minio/bin mkdir -p /home/minio/data#进入上面创建的bin目录下 cd /home/minio/bin#下载minio&#xff08;最新版minio无法通过页面的控制台配置accesskey建议选择2024年的版本操作&#xff09; ht…

【云故事探索】NO.16:阿里云弹性计算加速精准学 AI 教育普惠落地

智能精准学寒雪老师 X 阿里云弹性计算&#xff1a;以坚实算力底座&#xff0c;实现 AI 一对一教育普惠的愿景 【导语】 当全球首个 K12 教育超级智能体“寒雪老师”在深夜为万千学子答疑解惑&#xff0c;支撑其流畅互动的&#xff0c;是阿里云弹性计算 15 年淬炼的坚实算力底座…

forge篇——配置

从这篇文章开始,我们开始研究forge代码,以下是forge源代码和代码解析 ForgeConfigSpec 类详细解析 ForgeConfigSpec 是 Minecraft Forge 模组开发中的核心配置类,基于 NightConfig 库实现,提供了类型安全、验证和自动纠正功能。以下是关键部分的详细解释: 1. 类定义与基…

全新发布|知影-API风险监测系统V3.3,AI赋能定义数据接口安全新坐标

7月31日&#xff0c;全知科技「知影-API风险监测系统V3.3」版本正式上线。在版本发布直播中&#xff0c;全知科技资深产品经理裴向南系统讲解了V3.3版本的核心亮点、能力升级与后续产品规划方向。作为全知科技自主研发的核心产品&#xff0c;「知影-API风险监测系统」自2017年起…