算法笔记【4】-冒泡排序法改进

news2024/11/16 19:32:59

一、冒泡排序缺点

冒泡排序是一种简单但效率较低的排序算法。冒泡排序通过比较相邻元素并交换位置来实现排序。具体而言,它从数组的第一个元素开始,依次比较相邻的两个元素,如果顺序错误则交换它们的位置,直到整个数组排好序为止。但是冒泡排序算法的时间复杂度为O(n^2),不管数据是否已经有序,都会进行比较。导致大数据量时执行效率低下,这里将探讨两种方式改进冒泡排序算法以降低时间复杂度

二、改进策略

在每一轮的内层循环中,如果没有交换元素,则说明数组已经有序,可以提前退出外层循环,避免不必要的比较操作。实际代码中可以在外层循环中加入是否进行数据交换的判断,直接退出循环,减少时间复杂度。以下是使用matlab编写的冒泡排序算法和改进冒泡排序算法的示例代码:

  • 冒泡排序算法函数
%% 冒泡排序函数
function [sortedArr,o] = bubbleSort(arr)
    n = length(arr);
    o = 0;%时间复杂度
    for i = 1:n-1
        for j = 1:n-i
            o = o + 1;
            if arr(j) > arr(j+1)
                % 交换元素
                temp = arr(j);
                arr(j) = arr(j+1);
                arr(j+1) = temp;
            end
        end
    end
    sortedArr = arr;
end
  • 改进冒泡排序算法函数
%% 改进冒泡排序函数
function [sortedArr,o] = mbubbleSort(arr)
    n = length(arr);
    o = 0;%时间复杂度
    for i = 1:n-1
        flag = false;
        for j = 1:n-i
            o = o + 1;
            if arr(j) > arr(j+1)
                % 交换元素
                temp = arr(j);
                arr(j) = arr(j+1);
                arr(j+1) = temp;
                flag = true;
            end
        end
        if flag == false
            break;
        end
    end
    sortedArr = arr;
end
  • 调用
clc;
clear;
arr = [65, 9,11,12,25,22,34];
%% 常规冒泡排序
[sortedArr,o] = bubbleSort(arr);
disp("***********常规冒泡排序*****************************");
disp("排序前的数组:");
disp(arr);
disp("排序后的数组:");
disp(sortedArr);
disp("时间复杂度:");
disp(o);
%% 改进冒泡排序
[sortedArr,o] = mbubbleSort(arr);
disp("***********改进冒泡排序*****************************");
disp("排序前的数组:");
disp(arr);
disp("排序后的数组:");
disp(sortedArr);
disp("时间复杂度:");
disp(o);

三、性能分析与结论
如图所示为上述两种方式的打印结果
在这里插入图片描述

可知,通过改进策略对数组[65, 9,11,12,25,22,34]冒泡排序,可以吧时间复杂度从21降低至15。
实际上针对需要排序的数组对象,冒泡排序的时间复杂度可最高仍然是O(n^2),但在数组有序度比较高时,可以降低时间复杂度,在最好情况下,即数组已经有序时,时间复杂度可达到O(n)。
下面两图是针对同一组数据使用冒泡算法和改进冒泡算法的排序流程图。可以直观的看出两种方式的差异。

  • 常规冒泡排序法过程示意
    在这里插入图片描述

  • 改进冒泡排序法过程示意
    在这里插入图片描述

三、总结

改进冒泡排序算法仍然对于学习和理解基本排序算法有着重要意义。通过深入掌握冒泡排序的原理以及不断进行优化,我们可以更好地理解算法的设计思想,并为今后解决各类排序问题提供参考。然而,冒泡排序仍然不适用于大规模数据的排序,因为时间复杂度和数据的有序程度相关,不完全可控。在实际应用中,我们更倾向于使用其他高效的排序算法,如快速排序或归并排序。

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

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

相关文章

RK3399平台开发系列讲解(基础篇)应用程序代码优化技巧

🚀返回专栏总目录 文章目录 一、利用高速缓存二、代码内联三、restrict 关键字四、消除不必要的内存引用沉淀、分享、成长,让自己和他人都能有所收获!😄 📢我主要会为你介绍四个优化 应用代码的技巧,它们分别是 利用高速缓存利用代码内联利用 restrict 关键字消除不必…

Java架构师软件可靠性构建

目录 1 导学2 软件可靠性基本概念3 软件可靠性建模4 软件可靠性管理5 软件可靠性设计6 软件可靠性测试与评价想学习架构师构建流程请跳转:Java架构师系统架构设计 1 导学 2 软件可靠性基本概念 软件可靠性是软件产品在规定的条件下和规定的时间区间完成规定功能的能力。软件…

Java精品项目源码爱心捐赠平台网站(编号V65)

Java精品项目源码扶农助农平台建设系统(编号V64) 大家好,小辰今天给大家介绍一个爱心捐赠平台网站(编号V65),演示视频公众号(小辰哥的Java)对号查询观看即可 文章目录 Java精品项目源码扶农助农平台建设系统(编号V64)难度指数&a…

修仙路上的基石 ->继承与实现

继承与实现的区别 不同点: 继承:不强制 子类重写父类方法 实现:强制 实现类重写接口的全部方法共同点: 都可以使用多态 继承:父类 父类对象 new 子类() 实现:接口 接口对象 实现类.调用方法(); 这里…

[尚硅谷React笔记]——第7章 redux

目录: redux简介redux工作流程求和案例_纯react版求和案例_redux精简版redux完整版异步action版对react-redux的理解连接容器组件与UI组件,react-redux基本使用优化1_简写mapDispatch优化2_Provider组件的使用优化3_整合UI组件与容器组件数据共享_编写P…

风云七剑攻略,最强阵容搭配

今天的风云七剑攻略最强阵容搭配给大家推荐以神仙斋减怒回血为主的阵容。 关注【娱乐天梯】,获取内部福利号 首先,这个角色在这个阵容当中,所有的角色当中,他的输出系数是最高的,已经达到了200%的层次,而且…

【NLP】什么是语义搜索以及如何实现 [Python、BERT、Elasticsearch]

语义搜索是一种先进的信息检索技术,旨在通过理解搜索查询和搜索内容的上下文和含义来提高搜索结果的准确性和相关性。与依赖于匹配特定单词或短语的传统基于关键字的搜索不同,语义搜索会考虑查询的意图、上下文和语义。 语义搜索在搜索结果的精度和相关…

Linux 文件系统之虚拟文件系统

文章目录 一、简介二、进程读写文件示例三、VFS高速缓存参考资料 一、简介 虚拟文件系统(Virtual File System,简称 VFS)是内核中的软件层,为用户空间程序提供文件系统接口。它还在内核中提供了一个抽象层,允许不同的…

SQL 通用数据类型

SQL 通用数据类型 数据类型定义了存储在列中的值的类型。 SQL 通用数据类型 数据库表中的每一列都需要有一个名称和数据类型。 SQL 开发人员必须在创建 SQL 表时决定表中的每个列将要存储的数据的类型。数据类型是一个标签,是便于 SQL 了解每个列期望存储什么类型的…

[GKCTF 2021]easycms 禅知cms

一道类似于渗透的题目 记录一下 首先扫描获取 登入界面 admin/12345登入 来到了后台 然后我们开始测试有无漏洞点 1.文件下载 设计 自定义 导出 然后进行抓包 解密后面的内容 发现是绝对路径了 所以这里我们要获取 flag 就/flag即可 L2ZsYWc /admin.php?mui&fdownlo…

linux的使用学习(1)

Linux 修改root密码 1.以 root 用户或具有 sudo 权限的登录到 Linux 系统。 2.打终端,并执行以下命令以更改 root 用户的密码: sudo passwd root 3.然后,系统会要求你输入新的 root 密码。请注意,在输入密码时,终端界…

图、深度优先(DFS)、广度优先(BFS)

图 基本介绍 表示方式 图的创建 from typing import Listclass Graph:vertex_list: List[str] [] # 存储顶点的数组edges: List[list] [] # 存储图中各条边的邻接矩阵num_edges: int 0 # 边的数总数def __init__(self, n: int):"""根据传入的顶点个数初始…

11、插件注入到vue实例中

新建插件 nuxt-demo2\plugins\vue-inject.js import Vue from "vue"Vue.prototype.$test function (str) {console.log(str) }配置插件 nuxt-demo2\nuxt.config.js export default {...// Plugins to run before rendering page: https://go.nuxtjs.dev/config-…

表格识别软件:科技革新引领行业先锋,颠覆性发展前景广阔

表格识别软件的兴起背景可以追溯到数字化和自动化处理的需求不断增加的时期。传统上,手动处理纸质表格是一项费时费力的工作,容易出现错误,效率低下。因此,开发出能够自动识别和提取表格数据的软件工具变得非常重要。 随着计算机…

Xcode运行程序提示 Executable Path is a Directory 问题解决

一、首先运行模拟器报错(没有记录),解决办法: TARGET->Build Settings->Architectures -> Exclude Architectures里面填入arm64,后运行模拟器成功 二、其次模拟器开发完成后,xcode运行真机调试&…

canvas:理解canvas / 基础使用 / Demo效果

一、理解Canvas Canvas是一个HTML5元素,用于在Web页面上绘制2D或3D图形。它允许使用JavaScript在网页上创建和操作图形。Canvas的主要功能是绘图,但也可以用来实现其他功能,如动画和交互式游戏。 使用Canvas,可以创建各种形状、…

【AOP进阶】实现重试机制

📚目录 ⚙️简介:✨注解定义:⛳RetryMechanism ⌛编写AOP代码:⚓RetryMechanismAspect 切面 ⛵演示:⛴如何使用RetryMechanism:⚡️正常请求如下:☘️测试异常并且重试:☄️测试异常…

WSL2 Ubuntu安装CUDA Toolkit

目前CUDA ToolKit需要切换到WSL2,在WLS1下不支持。之前折腾了很久,才从WSL1的坑中爬出来,仅写此文避免大家再从坑里走一次。 Windows WSL2相关 检查正在运行的 WSL 版本 可列出已安装的 Linux 发行版,并通过在 PowerShell 或 W…

Android NDK开发详解之ndk-gdb

Android NDK开发详解之ndk-gdb 要求用法选项 线程支持 NDK 包含一个名为 ndk-gdb 的 Shell 脚本,可以启动命令行原生调试会话。偏好使用 GUI 的用户则应阅读在 Android Studio 中调试这篇文档。 要求 要运行命令行原生调试,必须满足以下要求&#xff1…

SDK 消息处理

目录 消息处理 窗口通知消息处理 鼠标消息 键盘消息 绘图消息 WM_PAINT 客户区与非客户区 WM_PAINT消息 BeginPaint && EndPaint 模仿记事本输入字符功能 定时器 消息处理 窗口的过程函数接收到消息后并且进行处理。平时常用的消息以及官方参考文档&#xf…