排序算法 - 冒泡排序

冒泡排序算法应该可以说是很经典的一种对数据进行排序的的算法了,甚至在很多的介绍算法的数据中,它可能还是放在最前面开始讲解的。

冒泡排序算法到底是咋样的呢?冒泡这个说法又是怎么得来的呢?

首先先理解一下冒泡算法的实现原理。

冒泡算法的实现原理:是在一组散乱的数据中,按照升序或者降序的方式,不断的比较相邻的两个元素数据,如果第一个比第二个大(或者第一个比第二个小),就交换这两个数据元素的位置。

每一对相邻的数据元素都进行比较,交换位置,直到结尾的最后一对。这个过程就实现了将最大(最小)的元素放到最后的位置。

不断的重复上面的步骤,最后就能将数据中的最大(最小)的元素放到最后。这个过程就像是水里的泡泡产生的过程,最底下的最小,在上升过程中逐渐变大,直到最后冒出水面的泡泡是最大的。也许这就是冒泡算法的名字由来吧!

冒泡算法的实现过程可以用下面的动图演示一下:

上图中的演示就是按照将数据按照从小到大的顺序进行排列,最终要实现最后的那个位置的元素需要时最大的目的。这个过程就像冒泡一样。

冒泡排序算法什么时候能最快完成排序和最慢排成排序?(我这里以升序为例说明)

最快的时候应该是在所需要排序的数据正好正序的时候了,这个时候不需要进行任何数据的交换。

最慢的时候应该是在数据正好是反序的时候,这个时候每一对相邻的数据都需要进行一次交换排序,也是费时间最长的。

用C语言实现的简单冒泡算法如下:(升序为例)

void maopao_sort(int *arr,int len)
{
    int i,j,temp;
    for(i=0;i<len-1;i++)
    {
        for(j=0;j<len-1-i;j++)
        {
            if(arr[j] > arr[j+1])
            {
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}

从程序中可以看的出来,假如共有 n 个数据进行排序,冒泡排序算法最终要实现的排序次数为 n-1次。

那如果在排序中,经过几次排序就已经完成了数据的排序,那之后的几次都不需要检查数据了,那岂不是有好几次是在“空跑”?这样浪费了一些时间,这种情况最好能做点优化。

优化后的代码如下:

void maopao_sort(int *arr,int len)
{
    int needSortFlag = 0;
    int i,j,temp;
    for(i=0;i<len-1;i++)
    {
        for(j=0;j<len-1-i;j++)
        {
            if(arr[j] > arr[j+1])
            {
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
                needSortFlag = 1;
            }
        }
        if(!needSortFlag) break;
    }
}

至此,冒泡排序算法的原理和讲解就结束了,总而言之,冒泡排序算法还是比较简单的。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java开发 - 布隆过滤器初体验

目录 前言 布隆过滤器 什么是布隆过滤器 布隆过滤器的作用 布隆过滤器原理 怎么设计布隆过滤器 布隆过滤器使用案例 安装布隆过滤器 添加依赖 添加配置 添加工具类 添加测试代码 简单测试 特别提醒​​​​​​​ 结语 前言 前面三篇&#xff0c;已经把消息队列…

裸辞3个月,面试了25家公司,终于找到心仪的工作了

​上半年裁员&#xff0c;下半年裸辞&#xff0c;有不少人高呼裸辞后躺平真的好快乐&#xff01;但也有很多人&#xff0c;裸辞后的生活五味杂陈。 面试25次终于找到心仪工作 因为工作压力大、领导PUA等各种原因&#xff0c;今年2月下旬我从一家互联网小厂裸辞&#xff0c;没…

蓝桥杯刷题第九天

题目描述本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。素数就是不能再进行等分的整数。比如7&#xff0c;11。而 9 不是素数&#xff0c;因为它可以平分为 3 等份。一般认为最小的素数是2&#xff0c;接着是 3&#xff0c;5&…

深度学习面试题汇总(一)

深度学习面试题汇总&#xff08;一&#xff09; 文章目录深度学习面试题汇总&#xff08;一&#xff09;1.Dropout1.1Dropout在训练的过程中会随机去掉神经元&#xff0c;那么在编码过程中是怎么处理的呢&#xff1f;1.2dropout的训练过程需要做rescale&#xff0c;这个过程是什…

Candence PCB Si 仿真设计篇3:板级链路仿真

接上篇Candence PCB Si 仿真设计篇2&#xff1b;提示仿真链路中无VIA过孔仿真模型&#xff0c;可手动添加VIA过孔仿真模型&#xff1b; 1.添加过孔VIA仿真模型. 在SigXplorer PCB SI GXL界面中&#xff0c;菜单栏Analyze->Via Model Generator弹出设置VIA模型设置&#xf…

VR全景城市,用720全景树立城市形象,打造3D可视化智慧城市

随着城市化进程的加速&#xff0c;城市之间的竞争也日益激烈。城市管理者们需要寻求新的方式来提升城市的品牌形象和吸引力。在这个过程中&#xff0c;VR全景营销为城市提供了一种全新的营销手段&#xff0c;可以帮助提升城市的价值和吸引力。一、城市宣传新方式VR全景营销是一…

自学大数据第八天~HDFS命令(二)

嗨喽,好久不见,最近抽空复习了一下hadoop,书读百遍,其意自现这句话还真是; 继续学习HDFS常用命令 改变文件 拥有者~chown hdfs dfs -chown -R hadoop /user/hadoop使用 -R 将使改变在目录结构下递归进行。命令的使用者必须是超级用户。 改变文件所属组-chgrp hdfs dfs -chgr…

Swing开发教程从入门到实践(一)

文章目录开发工具设置实战示例自定义组件常用组件总览JFrameJDialogJPanelLayout布局高级扩展扩展皮肤FlatLafweblaf扩展组件自定义组件SwingX打包部署打包成可执行Jar打包成成品参考开发工具 传统套件IDEAUI Designer。 UI Designer是一个idea插件&#xff0c;可以帮助我们通…

tailwind和bootstrap对比优劣有哪些,给前端开发者的一些建议

一、概述Tailwind和Bootstrap是两种流行的CSS框架&#xff0c;它们都提供了快速、易用的CSS类库来帮助前端开发者构建出现代化的网站和应用程序。它们有一些相似之处&#xff0c;但也有很多不同的优势和劣势。二、对比Tailwind的优势:1.自定义程度更高: Tailwind提供的所有CSS类…

【数论】最大公约数、约数的个数与约数之和定理

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…

朋友去华为面试,轻松拿到26K的Offer,羡慕了......

最近有朋友去华为面试&#xff0c;面试前后进行了20天左右&#xff0c;包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说&#xff0c;80%的人都会栽在第一轮面试&#xff0c;要不是他面试前做足准备&#xff0c;估计都坚持不完后面几轮面试。 其实&…

java面试八股文之------Java并发夺命23问

java面试八股文之------Java并发夺命23问&#x1f468;‍&#x1f393;1.java中线程的真正实现方式&#x1f468;‍&#x1f393;2.java中线程的真正状态&#x1f468;‍&#x1f393;3.如何正确停止线程&#x1f468;‍&#x1f393;4.java中sleep和wait的区别&#x1f468;‍…

【STC15单片机】 超声波模块的使用

目录 1 基于STC15F2K60S2的超声波测距代码 1.1 基本注意事项 1.1.1 跳线帽接法 1.1.2 晶振设置 1.2 板载超声波工作原理 1.2.1 原理总结 1.2.2 超声波代码思路 1.3 STC15单片机代码部分 1.3.1 定时器0&定时器1初始化 1.3.2 超声波ultrasonic.c ultrasonic.h文件配…

C++修炼之练气期第八层——内联函数

文章目录 一、宏的缺点 引例 改正一 改正二 改正三 宏的缺陷 二、内联函数的概念 三、内联与非内联的区别 四、内联函数的特性 专栏导读 &#x1f338;作者简介&#xff1a;花想云&#xff0c;在读本科生一枚&#xff0c;致力于 C/C、Linux 学习。 &#x1f338;本文收…

【linux】:进程地址空间

文章目录 前言一、进程地址空间总结前言 本篇文章接着上一篇文章继续讲解进程&#xff0c;主要讲述了进程在运行过程中是如何在内存中被读取的以及为什么要有虚拟地址的存在&#xff0c;CPU在运行过程中是拿到程序的虚拟地址还是真实的物理内存。 一、进程地址空间 下面我们先…

【Spring从入门到实战】第 5 讲:SpringBoot实现拦截器及其原理

本文已收录于专栏&#x1f332;《Spring从入门到实战》&#x1f332;专栏前言 大家好&#xff0c;我是执梗。本专栏将从Spring入门开始讲起&#xff0c;详细讲解各类配置的使用以及原因&#xff0c;到使用SpringBoot进行开发实战&#xff0c;旨在记录学习生活的同时也希望能帮到…

【Maven】Maven的安装与下载

目录 一、Maven 软件的下载 二、Maven 软件的安装 三、JDK 的准备与统一 1. JDK 环境: 2. Maven 及 JDK 配置 四、Maven 软件版本测试 &#x1f49f; 创作不易&#xff0c;不妨点赞&#x1f49a;评论❤️收藏&#x1f499;一下 一、Maven 软件的下载 为了使用 Maven 管理…

6万字144道耗时72小时吐血整理【金三银四(金九银十)面试小抄之Java经典面试题基础篇总结】(附答案)

目录一.前言二.Java基础面试篇1. 什么是Java&#xff1f;2.Java 和 C的区别&#xff1f;3.Java中常用的注释以及作用&#xff1f;4.标识符的命名规则5.JVM、JRE和JDK的关系6.Oracle JDK 和 OpenJDK 的对比7.Java中基本数据类型8.int 和 Integer 有什么区别9.switch 是否能作用在…

【Effective C++详细总结】第二章 构造/析构/赋值运算

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;C/C知识点 &#x1f4e3;专栏定位&#xff1a;整理一下 C 相关的知识点&#xff0c;供大家学习参考~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;…

理清gcc、g++、libc、glibc、libstdc++的关系

0 理清gcc、g++、libc、glibc、libstdc++的关系 0.1 $ dpkg -L libc6 $ dpkg -L libc6 /lib/x86_64-linux-gnu /lib/x86_64-linux-gnu/ld-2.31.so /lib/x86_64-linux-gnu/libBrokenLocale-2.31.so /lib/x86_64-linux-gnu/libSegFault.so /lib/x86_64-linux-gnu/libanl-2.31.s…