0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

揭秘冒泡排序、交换排序和插入排序

Android编程精选 来源:编程学习总站 作者:写代码的牛顿 2021-06-18 09:57 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

01

冒泡排序

在实现冒泡排序代码之前我们先理解一下什么是冒泡排序,我们举一个现实生活中的例子来帮助我们理解。

操场排队我们都知道吧,现在有一支队伍,有的人身高一样有的不一样,这个时候我们需要一个教官对这支队伍进行整理,使得队伍里的人从低到高的排下去,教官想到了一种排序算法来对这支队伍进行身高排序。

如何理解冒泡排序

教官立马想到了一个排序算法,从第1个人开始往队伍后面的方向相邻的两个人进行身高对比,如果前面的人比后一个人高则两人交换位置。

最后最高的人排在了队伍的最后面,教官又从第2个人开始往队伍后面的方向,相邻的2个人进行身高对比,如果前面的人比后一个人高则两人交换位置,最后最高的人排在了队伍的最后面。

由于前面的排序过程已经选出了队伍里身高最高的人,所以后面的排序过程不对已经排好序的进行对比,最后教官重复上面的步骤最终将队伍按身高从低到高的排好序。教官所用的排序算法正是冒泡排序算法,时间复杂度是O(n^2)。

冒泡排序的实现

现在我们用C++实现冒泡排序算法,定义一个模板类,声明冒泡排序算法函数。

template《typename T》 class Sort{ public: void bubble_sort(T *arr, int size); //冒泡排序 };

冒泡排序实现代码如下:

//冒泡排序 template《typename T》 void Sort《T》::bubble_sort(T *arr, int size) { if(arr == nullptr || size 《= 0){ return; } T temp; for(int i = 0; i 《 size; i++){ for(int j = 0; j 《 size - i; j++){ if(arr[j] 》 arr[j + 1]){ temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } }

02

交换排序

如何理解交换排序

前面教官使用了冒泡排序对队伍进行了整理,已经按照身高从低到高的排序,但是从排序过程可以看出冒泡排序每个人互相进行过对比,做了不必要的重复工作,类似于这种a和b对比,b和a又进行对比。教官觉得这个排序算法效率不高,想要消除不必要的重复工作,于是又想到了一个排序算法。

教官先让第1个个人走出队列,从第2个人开始第1个人依次和队伍里剩下的人进行对比,遇到比第1个人矮则互相交换位置,并且身高更矮的人继续执行剩余人的身高对比,最后对比完整个队伍,找出了最矮的人,将最矮的人放在第1位。

接下来教官让第2个人走出来,从第3个人开始依次和队伍里剩下的人进行对比,遇到比第2个人更矮的人和第一个人的处理方式一样,最后找到次矮的人,将次矮的人放在了第2的位置。

最后教官重复上面的步骤,依次让第3、4、5.。。。。.n-1个人走出队列依次和队伍里剩下的人进行身高对比,放在合适的位置。这种排序算法称为交换排序,第1个人进行了(n-1)次对比,第2个人进行了(n-2)次对比。。。。。。第n-1个人进行了一次对比,所以时间复杂度是O(n^2)。

交换排序的实现

声明交换排序函数

template《typename T》 class Sort{ public: void bubble_sort(T *arr, int size); //冒泡排序 void swap_sort(T *arr, int size); //交换排序 };

交换排序函数实现

//交换排序 template《typename T》 void Sort《T》::swap_sort(T *arr, int size) { if(arr == nullptr || size 《= 0){ return; } T temp; for(int i = 0; i 《 size - 1; i++){ for(int j = i + 1; j 《 size; j++){ if(arr[i] 》 arr[j]){ temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } }

03

插入排序

如何理解插入排序

教官还是觉得算法不理想,效率不够高,无论是冒泡排序和交换排序在队伍里原本就是有序的情况下都要进行对比,那么有没有一种排序算法在队伍原本就是有序的情况下更快呢?教官最后想了很久终于想到了一种效率更高的排序算法。

教官把第1个人当做只有1个人的队伍并且是有序的,让第2个人走出队伍,和第1个人进行对比身高,如果第2个人比第1个人矮那么第1个人就放到第2个人的位置,第2个人到第1个人的位置。进行过这一轮对比我们就知道,第1个人和第2个人是有序排列的。

同样的,教官又叫第3个人走出队列,从第2个人开始依次往前进行身高对比,比第3个人身高更高的人就往后挪一个位置,直到遇到身高比第3个人矮的人则停止对比,将第3个人排在这个人的身后。

最后教官依次让第4、5、6.。。。。的人走出队伍和上面的步骤一样依次和前面的进行身高对比,找到合适的位置就插入,直到所有人从低到高的排序。时间复杂度是O(N^2),但是如果队伍原本就是从低到高的排列,那么时间复杂度是O(N)。

插入排序代码实现

教官所用的身高排序算法正是插入排序算法,现在我们用C++代码实现插入排序算法,插入排序函数声明如下。

template《typename T》 class Sort{ public: void insert_sort(T *arr, int size); //插入排序 void bubble_sort(T *arr, int size); //冒泡排序 void swap_sort(T *arr, int size); //交换排序 };

这里我们定义一个模板类,声明插入排序算法,插入排序算法实现代码如下:

//从小到大排序 template《typename T》 void Sort《T》::insert_sort(T *arr, int size){ if(arr == nullptr || size 《= 0){ return; } int i = 1; int j = 0; while(i 《 size){ T data = arr[i]; j = i - 1; while(j 》= 0 && arr[j] 》 data){ arr[j + 1] = arr[j]; //大的数据则往后挪 j--; } if(j 《 0){ j = 0; } arr[j] = data; i++; } }

04

结果验证

现在我们写一个小程序验证一下算法的正确性。

int main() { int arr[10] = {8, 3, 21, 5, 6, 2, 3, 8, 1, 43}; Sort《int》 sort; std::cout 《《 “插入排序结果” 《《 std::endl; sort.insert_sort(arr, 10); //插入排序 for(int e : arr){ std::cout 《《 e 《《 “ ”; } std::cout 《《 std::endl; int arr2[10] = {8, 32, 56, 5, 7, 8, 98, 78, 6, 7}; sort.bubble_sort(arr2, 10); //冒泡排序 std::cout 《《 “冒泡排序结果” 《《 std::endl; for(int e : arr2){ std::cout 《《 e 《《 “ ”; } std::cout 《《 std::endl; int arr3[10] = {8, 4, 2, 3, 5, 6, 8, 3, 10, 50}; sort.swap_sort(arr3, 10); //交换排序 std::cout 《《 “交换排序结果” 《《 std::endl; for(int e : arr3){ std::cout 《《 e 《《 “ ”; } std::cout 《《 std::endl; return 0; }

编译运行输出如下:

插入排序结果 1 3 6 8 21 21 21 21 43 43 冒泡排序结果 0 5 6 7 7 8 8 32 56 78 交换排序结果 2 3 3 4 5 6 8 8 10 50

输出结果完全正确,算法实现正确。

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4406

    浏览量

    66863
  • C++
    C++
    +关注

    关注

    22

    文章

    2122

    浏览量

    76719
  • 代码
    +关注

    关注

    30

    文章

    4942

    浏览量

    73169

原文标题:数据结构与算法篇-冒泡排序、交换排序和插入排序

文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    拼多多商品列表API使用指南

    商品。 分类筛选:按商品类目进行筛选。 价格排序:按商品价格进行升序或降序排列。 销量排序:按商品销量进行排序。 分页查询:支持大数据量的分页获取。 2.公共请求地址:c0b.cc/R4rbK2 。 二、Python请求示例 以
    的头像 发表于 11-29 15:17 407次阅读

    C语言的常见算法

    ; } } ``` ### 插入排序 (Insertion Sort) ```c void insertionSort(int arr[], int n) { for (int i = 1; i < n
    发表于 11-24 08:29

    1688 拍立淘接口实战:从图像优化、工厂排序到供应链匹配(附可跑代码)

    深耕B2B电商十余年,亲历1688拍立淘接口20+坑:从图像预处理、权限申请到工厂排序。本文详解核心参数、实战代码及多图验证、定制方案生成等高级技巧,助你实现“看图找厂”精准匹配,附可运行代码,新手也能少走两年弯路。
    的头像 发表于 10-09 10:39 296次阅读

    Microchip EV28J28A超声波电源评估板技术解析与应用指南

    Microchip Technology EV28J28A 超声波电源评估板具有超声波脉冲发生器和多路复用器演示所需的所有电压轨。该评估板提供电源排序和故障保护。EV28J28A评估板还支持外部同步。该板可自动处理脉冲发生器演示板所需的上电和掉电排序
    的头像 发表于 10-06 16:07 1041次阅读
    Microchip EV28J28A超声波电源评估板技术解析与应用指南

    使用env工具 生成的mdk工程 中的 头文件路径太乱了怎么解决?

    能不能按照相似路径归类排序
    发表于 09-16 07:46

    Texas Instruments TPS743低压差 (LDO) 线性稳压器数据手册

    和内核引脚之间ESD结构的应力。借助电源良好输出和使能输入,可使用外部稳压器轻松实现排序。借助这种灵活性,用户可以配置解决方案,满足DSP、FPGA和其他具有特殊启动要求的应用的排序要求。
    的头像 发表于 07-04 15:41 834次阅读
    Texas Instruments TPS743低压差 (LDO) 线性稳压器数据手册

    国际首创新突破!中国团队以存算一体排序架构攻克智能硬件加速难题

    2025 年 6 月 25 日,北京大学团队在智能计算硬件方面取得领先突破,国际上首次实现了基于存算一体技术的高效排序硬件架构 (A fast and reconfigurable
    的头像 发表于 07-02 16:50 563次阅读
    国际首创新突破!中国团队以存算一体<b class='flag-5'>排序</b>架构攻克智能硬件加速难题

    Analog Devices Inc. MAX16895 监控电路特性/应用/功能图

    Analog Devices MAX16895监控电路是小型、低功耗、电压监控电路,具有排序功能。这些器件具有可调的、低至0.5V的电压监控阈值,并可利用外部电容调节延迟时间。这些Analog Devices器件非常适合用于电源排序、复位
    的头像 发表于 06-26 09:34 561次阅读
    Analog Devices Inc. MAX16895 监控电路特性/应用/功能图

    技术干货 德思特ADC/DAC静态参数分析系列(一)——什么是ADC转换点?

    本文将引领您深入理解ADC(模数转换器)中的一个关键概念——转换点,并介绍跳变点搜索法和排序代码方法。
    的头像 发表于 05-30 11:17 526次阅读
    技术干货 德思特ADC/DAC静态参数分析系列(一)——什么是ADC转换点?

    低成本电源排序器解决方案

    绝大多数负载点DC-DC转换器可以将上一个转换器的电源就绪输出连接至下一个转换器的使能输入,实现上电排序。这种方法只适合比较简单的设计,不能满足多数现代微处理器和DSP的要求一这类器件要求断电顺序必须与上电顺序相反。许多厂商针对这类应用推出了可编程排序IC,但器件价格较为
    的头像 发表于 05-21 09:55 968次阅读
    低成本电源<b class='flag-5'>排序</b>器解决方案

    UCD9224 2 MHz、2 轨、4 相数字 PWM 降压控制器,具有改进的排序功能技术资料

    和管理。 UCD9224 旨在为非隔离式 DC/DC 转换器应用提供各种理想的功能,同时通过减少外部电路来最大限度地减少系统组件总数。该解决方案将多回路管理与排序、裕度、跟踪和智能相位管理集成在一起,以优化整体系统效率。此外,还支持环路补偿和校准,无需添加外部元件。
    的头像 发表于 03-28 15:44 569次阅读
    UCD9224 2 MHz、2 轨、4 相数字 PWM 降压控制器,具有改进的<b class='flag-5'>排序</b>功能技术资料

    TPS74701-Q1 具有电源正常功能的汽车类 500mA、低 VIN (0.8V)、可调超低压差稳压器数据手册

    型的处理器和 ASIC 供电而设计。使能输入和电源就绪输出允许使用外部稳压器轻松排序,从而允许配置满足具有特殊启动要求的广泛应用的排序要求的解决方案。
    的头像 发表于 03-06 14:46 880次阅读
    TPS74701-Q1 具有电源正常功能的汽车类 500mA、低 VIN (0.8V)、可调超低压差稳压器数据手册

    CS1237数据跳动帮忙看看是什么原因造成的?

    公司项目, 用CS1237 称重 有两个问题: 第一情况:输出速度只能选择00和01 大于01.写入和读取就一致 所以项目现在用的是0x1C 第二:有传感器插入,但是是没有物品的时候 连续读10次
    发表于 02-17 10:43

    详解Linux sort命令之掌握排序技巧与实用案例

    在linux系统使用过程中,提供了sort排序命令,支持常用的排序功能。 常用参数 sort命令支持很多参数,常用参数如下:   短参数 长参数 说明 -n – number-sort 按字符串数值
    的头像 发表于 01-09 10:10 1598次阅读

    TimSort:一个在标准函数库中广泛使用的排序算法

    在计算机科学的领域,排序算法是每位学生必学的基础,而排序的需求是每位程序员在编程过程中都会遇到的。 在你轻松调用 .sort() 方法对数据进行排序时,是否曾好奇过,这个简单的方法背后使用的是哪种
    的头像 发表于 01-03 11:42 964次阅读