【算法系列 | 1】深入解析排序算法之冒泡排序

news2024/12/25 1:26:28

序言

你只管努力,其他交给时间,时间会证明一切。

文章标记颜色说明:

  • 黄色:重要标题
  • 红色:用来标记结论
  • 绿色:用来标记一级论点
  • 蓝色:用来标记二级论点

决定开一个算法专栏,希望能帮助大家很好的了解算法。主要深入解析每个算法,从概念到示例。

我们一起努力,成为更好的自己!

今天第一讲,讲一下排序算法

1 基础介绍

排序算法是很常见的一类问题,主要是将一组数据按照某种规则进行排序。

以下是一些常见的排序算法:

  1. 冒泡排序(Bubble Sort)

  2. 插入排序(Insertion Sort)

  3. 选择排序(Selection Sort)

  4. 归并排序(Merge Sort)

  5. 快速排序(Quick Sort)

  6. 堆排序(Heap Sort)

这些排序算法各有特点,可以根据具体需求选择适合的算法。在实际应用中,常常需要综合考虑时间复杂度、空间复杂度、稳定性等因素进行选择。

今天先来看一下比较简单的冒泡排序 

冒泡排序

原理介绍

冒泡排序(Bubble Sort)是一种简单的排序算法,其基本思想是对待排序的元素从前向后依次比较相邻的两个元素,如果顺序不对则交换它们的位置,一轮比较下来,最大的元素就会“冒泡”到数组的末尾

重复这个过程,直到没有需要交换的元素为止,排序完成。

时间复杂度

冒泡排序的时间复杂度是O(n^2),空间复杂度是O(1)

适用场景

冒泡排序,它是一种稳定的排序算法,适用于处理小规模数据。不适合处理大规模数据,对于大规模数据的排序效率不高,不推荐使用。

当需要对大规模数据进行排序时,可以考虑其他排序算法,如归并排序、快速排序等。

示例讲解 

下面是一个冒泡排序的示例,对如下数组进行排序:[5, 3, 8, 4, 2]

第一轮比较:

5, 3, 8, 4, 2 -> 3, 5, 8, 4, 2

3, 5, 8, 4, 2 -> 3, 5, 4, 8, 2

3, 5, 4, 8, 2 -> 3, 5, 4, 2, 8

第一轮比较结束,最大的元素 8 已经被移动到了数组的末尾。

第二轮比较:

3, 5, 4, 2, 8 -> 3, 4, 5, 2, 8

3, 4, 5, 2, 8 -> 3, 4, 2, 5, 8

第二轮比较结束,次大的元素 5 已经被移动到了数组的倒数第二个位置。

第三轮比较:

3, 4, 2, 5, 8 -> 3, 2, 4, 5, 8

第三轮比较结束,次次大的元素 4 已经被移动到了数组的倒数第三个位置。

第四轮比较:

3, 2, 4, 5, 8 -> 2, 3, 4, 5, 8

第四轮比较结束,最小的元素 2 已经被移动到了数组的第一个位置。

经过四轮比较,数组已经被排好序了。

代码实现

python实现

def bubble_sort(arr):
    n = len(arr)
    # 外层循环控制排序的轮数
    for i in range(n):
        # 内层循环控制每一轮的比较和交换
        for j in range(0, n-i-1):
            # 如果前一个元素大于后一个元素,则交换它们的位置
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]

# 测试代码
arr = [5, 3, 8, 4, 2]
bubble_sort(arr)
print(arr)

执行结果

  

java 实现

public class BubbleSort {
    public static void bubbleSort(int[] arr) {
        int n = arr.length;
        // 外层循环控制排序的轮数
        for (int i = 0; i < n; i++) {
            // 内层循环控制每一轮的比较和交换
            for (int j = 0; j < n-i-1; j++) {
                // 如果前一个元素大于后一个元素,则交换它们的位置
                if (arr[j] > arr[j+1]) {
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
    }

    // 测试代码
    public static void main(String[] args) {
        int[] arr = {5, 3, 8, 4, 2};
        bubbleSort(arr);
        for (int i : arr) {
            System.out.print(i + " ");
        }
    }
}

运行结果

今天算法就到这里啦,下期见~ 

图书推荐

图书名称:

  • 《算法导论(原书第3版)》
  • 《程序员必会的40种算法》
  • 《计算机网络:自顶向下方法(原书第7版)》
  • 《TCP/IP详解》

《算法导论(原书第3版)》

作者:Thomas H.Cormen, Charles E.Leiserson, Ronald L.Rivest, Clifford Stein

推荐语:

影响全球千万程序员的“算法圣经”!MIT四大名师联手铸就,将严谨性和全面性融为一体深入讨论各类算法。

麻省理工学院、卡内基梅隆大学、斯坦福大学、加州大学伯克利分校、康奈尔大学、伊利诺伊大学厄巴纳-香槟分校等国内外千余所高校采用教材!

《程序员必会的40种算法》

作者

[加] 伊姆兰·艾哈迈德

推荐语:

致力于利用算法求解实际问题,帮助初学者理解算法背后的逻辑和数学知识。

算法一直在计算科学和计算实践中发挥着重要作用。除了传统计算之外,使用算法解决现实问题的能力是开发人员和程序员必须具备的一项重要技能。本书不仅能帮助你拓展技能,选择强有力的算法解决现实世界的问题,还能帮助你了解算法原理。

本书内容丰富,涉及算法基础、设计技术、分析方法、排序算法、查找算法、图算法、线性规划算法、机器学习算法、推荐算法、数据算法、密码算法和并行算法等内容,重点讲述如何使用Python进行算法实现和算法性能的比较与分析。

《计算机网络:自顶向下方法(原书第7版)》

推荐语:

本书是经典的计算机网络教材之一,采用了作者独创的自顶向下方法来讲授计算机网络的原理及其协议。自首次出版以来,已被译为14种语言,世界上数百所大学采用本书作为教材,有几十万学生和从业人员利用本书系统学习计算机网络的知识。本书已成为学习计算机网络知识的必读教材之一。

第7版保持了以前版本的特色,继续关注因特网和计算机网络的现代处理方式,注重原理和实践,为计算机网络教学提供了一种新颖和与时俱进的方法。

《TCP/IP详解》

作者:Kevin R. Fall, W. Richard Stevens, Gary R. Wright

推荐语:

网络专家、著名技术作家W. Richard Stevens的传世之作,内容详尽且极具权威,被誉为TCP/IP领域的不朽名著。

Stevens经典网络名著的整体重组和彻底更新 ,掌握当代网络协议原理及实现技术的必备参考书,全面阐述和透彻分析网络常用协议的工作过程和实现细节。涵盖最新的网络协议和最佳的实践方法,显著加强安全方面内容

等不及的小伙伴,可以点击下方链接先睹为快:

图书链接

参与方式

图书数量:本次送出 3 本   !!!⭐️⭐️⭐️
活动时间:截止到 2023-06-06 12:00:00

抽奖方式:

  • 1本,留言+该留言论赞数的前1名!
  • 2本,评论区随机挑选小伙伴!
  • 留言内容:“那些看似不起波澜的日复一日,一定会在某一天让你看见坚持的意义!+【你想要的书名】”


参与方式:关注博主、点赞、收藏,评论区留言 

中奖名单 

🍓🍓 获奖名单🍓🍓

 中奖名单:请关注博主动态

名单公布时间:2023-06-06 下午

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

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

相关文章

大湾区C++模拟题

大湾区信息学创新大赛模拟题 一、单项选择题&#xff08;15题共30分&#xff09; 1.计算机的运算速度取决于给定的时间内&#xff0c;它的处理器所能处理的数据量。处理器一次能处理的数据量叫字长。已知64位奔腾处理器一次能处理64个信息&#xff0c;相当于&#xff08; A …

厨电「前浪」压「后浪」

作者 | 辰纹 来源 | 洞见新研社 俗话说&#xff0c;姜是老的辣。说的是老年人有经验&#xff0c;办事稳重老练。 俗话也说&#xff0c;长江后浪推前浪。说的是经过历练的新人新事胜过旧人旧事。 这两句话看似矛盾&#xff0c;实则充满哲理&#xff0c;老而弥坚的老手与初生牛…

网关如何让非Matter设备快速加Matter网络?

作为连接智能家居设备的重要桥梁&#xff0c;网关是所有命令请求的入口&#xff0c;并完美充当起“翻译官”的角色。它能够精准“翻译”拥有不同通信协议、数据传输格式及网络地址里所包含的信息&#xff0c;将数据重新打包&#xff0c;以适应目的系统的需求。 虽然网关对于智…

matlab学习笔记(十)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 matlab学习笔记&#xff08;十&#xff09; 一、实验目的二、实验原理和实验内容三、案例运行例1&#xff1a;电磁波传输问题的动态仿真&#xff0c;编写 MATLAB 程序实现线极…

Maven高级——分模块设计与开发

Maven的定义: 一个用来构建和管理java项目的工具。 分模块设计 一个大型项目通常需要有很多功能实现&#xff0c;这些功能分成多个模块&#xff0c;卸载一个项目里面最后只会导致这个项目越来越大。不便于维护&#xff0c;以及组件难以复用。 在项目设计的时候就可以将不同的…

九大亮点+六大好处,瑞云科技虚拟仿真实训平台引领教育信息化新潮流

随着新技术的快速发展和数字化转型的加速推进&#xff0c;高等教育面临着培养创新型、复合型、适应型人才的新要求。 虚拟仿真实训教学作为一种新型的教学模式&#xff0c;能够有效解决实训教学中的高投入、高损耗、高风险及难实施、难观摩、难再现的“三高三难”问题&#xf…

如何运行Python程序?

Python 是一种解释型的脚本编程语言&#xff0c;这样的编程语言一般支持两种代码运行方式&#xff1a; 1) 交互式编程 在命令行窗口中直接输入代码&#xff0c;按下回车键就可以运行代码&#xff0c;并立即看到输出结果&#xff1b;执行完一行代码&#xff0c;你还可以继续输…

手搓一个C++11的线程池(含测试)

实现 首先要有线程池这个结构体&#xff1a; 互斥锁条件变量消息队列关闭标志位 struct Pool {std::mutex mtx;std::condition_variable cond;std::queue<std::function<void()>> tasks;bool isClosed;//用来退出无限循环};【首先是线程池的对象】其实就是维护一…

【数据结构与算法】力扣:二叉树的前、中、后序遍历

递归法 前序遍历 给你二叉树的根节点 root &#xff0c;返回它节点值的前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 示例 3&#xff1a; 输入&#xff1a;…

IPO后,北森驶向HR SaaS深水区

透过这次发布会&#xff0c;能感知到的依旧是北森马不停蹄的“加速度”&#xff0c;纪伟国口中不断重复的“以客户为中心”&#xff0c;以及不断开放兼容的生态。 作者| 皮爷 出品|产业家 北森&#xff0c;还是那个北森。 在刚刚举办的“HR SaaS未来势”2023北森春季产品…

Vscode搭建开发调试STM32环境IDE

单片机开发IDE环境如KeilMDK&#xff0c;虽然操作简单&#xff0c;方便调试。但就是代码编辑风格很老套&#xff0c;中文符号乱码还是常有的事。而如今流行的vscode编辑器很不错&#xff0c;免费且相当轻量级&#xff0c;用来代码开发体验很不错&#xff0c;看着都舒服。Clion …

swagger在spring项目中的使用

一、Swagger2介绍 前后端分离开发模式中&#xff0c;api文档是最好的沟通方式。 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。 及时性 (接口变更后&#xff0c;能够及时准确地通知相关前后端开发人员)规范性 (并且保…

电子科技大学计算机系统结构复习笔记(一):概述

目录 前言 重点一览 计算机分类 弗林分类法 市场分类 计算机系统结构定义 实现技术\功耗\成本的趋势\可靠性(了解) 计算机性能 性能评价指标 性能评价方法 计算机设计的量化原则 基本方法 Amdahl‘s 定律 CPU 性能公式 / 时间计算 本章小结 前言 本复习笔记基于…

windows环境使用clion搭建redis5.0 redis6.0的源码阅读环境

1、下载cygwin https://cygwin.com/install.html 第一步选择从互联网安装 别放在C盘 选择直接连接 我这边选择的是163的节点 接下来&#xff0c;就是让我们选择要安装的东西&#xff0c;网上一般给的就是如下几个&#xff1a; gcc-core、gcc-g、make、gdb、binutils 一个个…

计算机视觉 | 人体关键点检测与MMPose

前言 人体姿态估计&#xff08;Human Pose Estimation&#xff09;是计算机视觉领域中的一个重要研究方向&#xff0c;也是计算机理解人类动作、行为必不可少的一步&#xff0c;人体姿态估计是指通过计算机算法在图像或视频中定位人体关键点&#xff0c;目前被广泛应用于动作检…

0x34RequestDownload请求下载

0x34RequestDownload 客户端请求协商从客户端到服务器的数据传输。 客户端使用requestDownload服务来启动从客户端到服务器的数据传输&#xff08;下载&#xff09; 。 服务器收到requestDownload请求消息后&#xff0c;服务器应在发送肯定响应消息之前采取所有必要的操作来接…

【手撕Spring源码】深度理解SpringMVC【上】

文章目录 DispatcherServletRequestMappingHandlerMappingRequestMappingHandlerAdapter自定义参数处理器自定义返回值处理器 参数解析器获取参数名对象绑定与类型转换底层第一套转换接口与实现底层第二套转换接口与实现高层转换接口与实现自定义转换器 ControllerAdvice 之 In…

NeRF与三维重建专栏(二)NeRF原文解读与体渲染物理模型

前言 上一章中我们大致介绍了三维重建的背景、NeRF应用于三维重建的难点以及相关数据集和评估指标&#xff0c;本章节将会详细介绍NeRF原文以及部分源码&#xff0c;以及体渲染的物理模型&#xff0c;来帮助读者更好理解NeRF&#xff1b;下一章我们将会结合colmap&#xff0c;讲…

PrivateGPT(如何部署及使用感受)

前言 最近在GitHub上出现了一个名为PrivateGPT的开源项目。该项目旨在为面临敏感数据、涉密信息或个人隐私问题的用户提供一种新的聊天工具。PrivateGPT具备完整的数据控制能力&#xff0c;使用户能够在本地环境中与强大的语言模型进行交互&#xff0c;无需上传数据到互联网或…

kotlin的for循环遍历

kotlin的for循环遍历 1、List val list listOf("A", "B", "C")for (item in list) {println(item)} A B C 2、List的in val list listOf("A", "B", "C")for (item: String in list) {println(item)} A B C 3、l…