排序(一)——冒泡排序、直接插入排序、希尔排序(BubbleSOrt,InsertSort,ShellSort)

        欢迎来到繁星的CSDN,本期的内容主要包括冒泡排序(BubbleSort),直接插入排序(InsertSort),以及插入排序进阶版希尔排序(ShellSort)。

        废话不多说,直接上正题!

一、冒泡排序

        冒泡排序是我们的老朋友了,我们最初模拟实现qsort的时候就是用它来模拟的(尽管qsort的底层原理实际是quicksort,即快排)。

        上代码!

void BubbleSort(int* a, int n)
{for (int j = 0; j < n; j++){// 单趟int flag = 0;for (int i = 1; i < n - j; i++){if (a[i - 1] > a[i]){Swap(&a[i - 1], &a[i]);flag = 1;}}if (flag == 0){break;}}
}

        代码相当简单,其思想就是通过两两之间的比较,每一趟都将最大的数据放在数组的最后

        缺点是,冒泡排序的速度相当慢,原因不仅仅在于比较的次数恒定(n*(n+1)/2次),更在于如果数据量庞大,各个数据移动的速度也相当慢。

        实际意义聊胜于无,但却很好地帮我们入门各大排序算法,这是它仍然活跃的意义。

     二、直接插入排序

       我们一般会叫它插入排序,在此加入“直接”二字,是为了区分它和希尔排序。

        插入排序的思路也是较为简单的。

        面对一个有n个元素的数组,如果前n-1个元素都有序,那么第n个元素通过和前面所有元素比较,就能得到该元素在数组中的位置。有一点数学归纳法的思想在里面。

        上代码!

void InsertSort(int* a, int n)
{//  [0, n-1]for (int i = 0; i < n - 1; i++){// [0, n-2]是最后一组// [0,end]有序 end+1位置的值插入[0,end],保持有序int end = i;int tmp = a[end + 1];while (end >= 0){if (tmp < a[end]){a[end + 1] = a[end];--end;}else{break;}}a[end + 1] = tmp;}
}

        由于一个元素一定有序,所以第一个元素不用排序。而从第二个元素开始,通过比较,不断插入到前面的数组中,使前n项都有序,如此往复,便可使得整个数组有序。

        相比于冒泡排序,插入排序少了大量重复的交换数值的工作,而是一步到位,得到数据的最终位置(尽管时常需要将所有数据后移,但代码中只是赋值,而非交换,效率比冒泡高的多)。

        两者运行时间差别:

        

        (此处数据为10000个)

        尽管如此,我们在实际工作中也很少使用直接插入排序,即使时间比冒泡排序少的多,其时间复杂度仍为O(n^2)。但不得不指出,它仍有应用,后续在快排的时候将会提到。

三、希尔排序

        

        希尔排序是插入排序的优化版本,优化到可以和快速排序一较高下。

        希尔排序主要做两件事:1、预排序。2、插入排序。

        由插入排序的代码可知,当数组越趋近于有序,比较和赋值的次数也越来越少。所以预排序的目的就是使得整个数组接近有序。

        上代码!

void ShellSort(int* a, int n)
{int gap = n;while (gap > 1){// +1保证最后一个gap一定是1// gap > 1时是预排序// gap == 1时是插入排序gap = gap / 3 + 1;for (size_t i = 0; i < n - gap; ++i){int end = i;int tmp = a[end + gap];while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}
}

        要点解释:

1、gap代表的含义是,下标相减为gap的元素为一组,进行插入排序。此举的意义是使得O(n^2)的复杂度造成的影响尽可能小,因为a*(n/a)^2小于n^2,a为任意整数。

2、而当gap等于1时再进行排序,就是插入排序了。

3、gap的大小实际上由写代码的人自己决定,没有一定gap越大,或者gap越小的效果最好,但可以确定的是,经过预排序的插排会比直接插排要更快。

4、上述代码中的gap是一个效果较好的gap,可以参照并直接使用。

        本篇内容到此结束,谢谢大家的观看!

        觉得写的还不错的可以点点关注,收藏和赞,一键三连。

        我们下期再见~

        往期栏目:

        一文带你入门二叉树!-CSDN博客

        栈和队列的介绍与实现-CSDN博客

        设计扫雷游戏_扫雷游戏设计-CSDN博客

        

        

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

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

相关文章

制作微信商城的步骤是什么

在当今这个数字化时代&#xff0c;微信已成为人们日常生活中不可或缺的一部分。随着微信生态的日益完善&#xff0c;微信商城成为了众多企业和商家拓展线上业务、触达潜在客户的重要渠道。那么&#xff0c;如何制作一个高效、专业的微信商城呢&#xff1f;本文将为您详细解析制…

做突破交易时,需要注意的进场细节有哪些?

突破交易揭示了市场未来的走向。 在这种情况下&#xff0c;面对市场时我们应该如何入场操作呢&#xff1f;接下来&#xff0c;让我们来细化一下实施的具体步骤。 01. 在交易中&#xff0c;周期的考量比价格突破更为关键。 当价格突破发生时&#xff0c;市场的平静被打破&#x…

生物素化的曼陀罗凝集素;Datura Stramonium Lectin

一、基本信息 中文名称&#xff1a;生物素化的曼陀罗凝集素 英文名称&#xff1a;Datura Stramonium Lectin (Biotinylated) 常用名&#xff1a;曼陀罗凝集素&#xff0c;生物素化 CAS号&#xff1a;N/A&#xff08;因不同制造商和产品而异&#xff0c;且可能未公开&#xff09…

MySQL黑马教学对应视屏笔记分享之聚合函数,以及排序语句的讲解笔记

聚合函数 注意&#xff1a;null值不参与聚合函数的计算。 分组查询 2.where与having的区别 执行时机不同&#xff1a;where是在分组之前进行过滤&#xff0c;不满足where条件&#xff0c;不参与分组&#xff1b;而having是分组之后对结果进行过滤。判断条件不同&#xff1a;w…

【区块链 + 智慧政务】一体化政务数据底座平台 | FISCO BCOS应用案例

为进一步贯彻落实《全国一体化政务大数据体系建设方案》、《中共中央国务院关于构建数据基础制度更好发挥 数据要素作用的意见》精神&#xff0c;一体化政务数据底座平台结合相应城市的数字经济现状基础、当前任务及未来发展 战略&#xff0c;规划建设数据底座&#xff0c;持续…

新品牌快速成长指南:揭秘品牌成功的黄金法则

打造一个新品牌是一个系统性工程&#xff0c;不是一两句话就能说清楚的。 作为一个13年的营销人&#xff0c;今天试图给大家以最简练和通俗的文字&#xff0c;详细讲讲打造一个全新的品牌都需要做些啥&#xff1f;码字不易&#xff0c;请多给点支持哦。 一、市场调研与定位&a…

python+selenium-UI自动框架之[优化]元素查找和BasePage页面

痛点&#xff1a;在页面查找元素的时候会遇到找不到或者其他无法处理某个字段的情况&#xff0c;又或者想要在输出的log或者report里面显示这个字段名称&#xff0c;这时候加上字段名称就很重要&#xff01; [3]pythonselenium - UI自动框架之封装查找元素https://mp.csdn.net…

PHP微信小程序视频图文流量主变现小程序系统源码

&#x1f4b0;微信小程序新机遇&#xff01;视频图文流量主变现秘籍&#x1f511; &#x1f680;【流量变现新风口】&#x1f680; 还在为微信小程序的庞大流量如何转化为真金白银而苦恼吗&#xff1f;今天&#xff0c;就带你揭秘“微信小程序视频图文流量主变现小程序”的神…

GPT-5:探索NLP新纪元的无限可能

目录 GPT-5: 定义自然语言处理新纪元的全方位突破引言: 迈向未来的语言之桥算法与架构: 深度进化的基石多模态融合: 超越文本的智慧对话连贯性与情境感知: 无缝交流的艺术个性化与定制化: 专属服务的未来伦理与安全: 负责任的创新GPT系列发展史: 迈向卓越的每一步结语: 共创智能…

Linux账户和组管理——账户和工作组分类,用户账号文件,/etc/passwd文件中7个字段,id 命令

## 账户和工作组的分类 ### 用户分为三类&#xff1a; - 超级账户——账户名为root&#xff0c;它具有一切权限&#xff0c;只有进行系统维护(例如&#xff1a;建立用户等)或其他必要情形下才用超级用户登录&#xff0c;以避免系统出现安全问题。 - 系统账户——是Linux系统正常…

几种常用的产生负电源的方法

电源电路是电路设计的重要环节&#xff0c;一般情况下&#xff0c;单电源能实现功能的用单电源就行&#xff0c;可选的方案很多&#xff0c;DC-DC、LDO等芯片很多。有时候&#xff0c;单电源无法满足需求时&#xff0c;就必须用到负电源。 今天就来介绍几种常用的负电源产生的…

北京金融联盟创新应用2024年第五期“圆桌会议”成功召开

来自信创CPU厂商、金融科技相关企业、以及银行证券等机构的数十名参会代表齐聚北京&#xff0c;围绕信创服务器芯片架构使用策略等议题&#xff0c;展开了深入的讨论&#xff0c;为金融信创与数字化转型的进一步深入发展提供了丰富的建议和参考。 会议围绕信创服务器芯片架构使…

什么是业务架构、数据架构、应用架构和技术架构

TOGAF(The Open Group Architecture Framework)是一个广泛应用的企业架构框架&#xff0c;旨在帮助组织高效地进行架构设计和管理。而TOGAF的核心就是由我们熟知的四大架构领域组成&#xff1a;业务架构、数据架构、应用架构和技术架构。 所以今天我们就来聊聊&#xff0c;企业…

高通平台 android7.1 蓝牙的可见性设置

1、情景 本机设备只打开蓝牙开关&#xff0c;但不停留在设置里面蓝牙页面时&#xff0c;其他设备扫描不到本机设备。 2、Android7.1中&#xff0c;默认的行为是&#xff0c;只有在设置里面的蓝牙页面&#xff0c;才会开启蓝牙的可见性&#xff1b;如果只是打开下拉栏的蓝牙快捷…

基于MacOS系统Sonoma 14.5的SSH服务禁止密码登录

基于系统Sonoma 14.5&#xff0c;不同系统有所差异。 修改sshd_config文件 sudo vim /etc/ssh/sshd_config找到以下两行取消注释&#xff0c;修改值为 no PasswordAuthentication no KbdInteractiveAuthentication no重启sshd服务 # 关闭服务 sudo launchctl unload -w /System…

安泰电压放大器的选型方案是什么

电压放大器是一种常见的电路元件&#xff0c;广泛应用于各种电子设备中。在选择电压放大器的时候&#xff0c;我们需要考虑一系列因素&#xff0c;以确保选型方案能够满足实际需求。下面安泰电子将详细介绍电压放大器选型的主要考虑因素&#xff0c;包括应用需求、技术性能、成…

自己写的逆向案例十二——一号店登录密码逆向

网址&#xff1a;1号店登录 找到登录接口&#xff1a; 查看栈 直接跟栈&#xff0c;不多说 &#xff0c;点击doubblesubmit栈 很明显发现加密位置&#xff0c;而且有很明显的提示&#xff0c;这是一个标准RSA类型的&#xff0c;看到new JSEncrypt和setPublicKey就知道了&…

【AI大模型新型智算中心技术建设白皮书 2024】

文末有福利&#xff01; 一、新算效——重塑计算架构 1.1 下一代 AI 芯片设计思路 以 GPU 为 代 表 的 高 性 能 并 行 计 算 芯 片 架 构 和 以 针 对 AI 领 域 专 用 加 速&#xff08;DSA, Domain Specific Architecture&#xff0c;DSA&#xff09;为代表的芯片架构是目…

setuptools打包-分发-安装-发布

一、定义 学习网址setup.py 编写打包安装开源到PYPI中 二、实现 学习网址 https://python.iswbm.com/c08/c08_15.htmlsetup.py 编写 采用分发工具setuptools进行发布&#xff0c;因此采用setuptools包进行setup.py的编写 demo案例 from setuptools import setup, find_pack…

springboot下 创建TCO客户端,并发送消息

import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service;import java.io.*; import java.net.Socket;/*** 请求tcp接口** author Mr丶s* date 2024/7/10 下午3:03* description*/ Slf4j Service public class TcpClientService {private Socket soc…