数据结构算法-冒泡排序算法

news2025/1/30 15:52:59

引言

虽然选择排序好用 ,但有点问题 也就是频繁找最大值下标 放到 未排序的后面
因为每次需要扫描整个未排序序列,找到最大值或最小值的下标,并将其交换到未排序序列的最后一个位置。这样做的问题在于,在后面的迭代中,我们仍然需要扫描整个未排序序列,包括已经排序好的部分,这是浪费时间的。

另外,选择排序是不稳定的排序算法,因为在找到最大值或最小值的下标时,并没有考虑值相同的元素的顺序。如果有多个相同值的元素,交换它们的位置可能会打乱它们的相对顺序

也就是说 相同的元素也交换 可能位置有变化
对于相同的元素,它们在排序后的位置可能会改变,因为冒泡排序会将相邻的两个元素进行比较和交换,这样相同的元素就可能会在排序过程中交换位置。对于选择排序而言,它在找到最大值或最小值的下标时,并没有考虑值相同的元素的顺序,因此如果有多个相同值的元素,交换它们的位置可能会打乱它们的相对顺序。因此选择排序也是不稳定的排序算法。

冒泡排序算法思想

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
到i=2的时候 已经是排序了 那么这里应该如何优化?
如果有一种机制 一开始默认已排序 在内层循环判断第一个比第二大发生交换的时候 制定为false
内层循环结束判断这个排序标志 为真排序完成直接退出外层循环

冒泡排序的基本思想是,通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就像水底的气泡一样逐渐向上冒。
在这个过程中,每次内循环都会将当前未排序部分的最大元素“冒泡”到其最终位置。因此,每次外循环之后,未排序部分的元素数目会减少一个。

冒泡排序算法专区

// 定义一个名为bubbleSort的函数,它接收两个参数:一个名为arr的整数数组和一个名为size的整数,表示数组的大小  
void bubbleSort(int arr[], int size) {  
  
    // 外层循环,用于控制排序的轮数。因为每一轮都会将最大的元素移动到数组的末尾,所以最多需要size-1轮。  
    for (int i = 0; i < size - 1; i++) {    
          
        // 内层循环,用于在每一轮中逐一比较相邻的元素。由于每一轮都会确保最大的元素移动到其应在的位置,因此内层循环只需要遍历到“size-1-i”即可。  
        for (int j = 0; j < size - 1 - i; j++) {    
              
            // 如果当前元素大于下一个元素,则交换它们的位置。这是冒泡排序的核心操作。  
            if (arr[j] > arr[j+1]) {    
                  
                // 调用swap函数交换两个元素的值。
                swap(arr[j], arr[j+1]);    
            }    
        }    
    }    
}
}

优化:

// 定义一个名为bubbleSort的函数,接收一个整数数组arr和数组的大小size作为参数  
void bubbleSort(int arr[], int size) {  
  
    // 外层循环,遍历整个数组  
    for (int i = 0; i < size - 1; i++) {    
          
        // 定义一个布尔变量swapped,用于记录是否发生了交换  
        bool swapped = false; // 用于记录是否发生了交换    
          
        // 内层循环,比较相邻的元素并进行交换  
        for (int j = 0; j < size - 1 - i; j++) {    
              
            // 如果当前元素大于下一个元素,则进行交换  
            if (arr[j] > arr[j+1]) {    
                  
                // 调用swap函数交换两个元素的值  
                swap(arr[j], arr[j+1]);    
                  
                // 将swapped设为true,表示发生了交换    
                swapped = true; // 发生了交换,将swapped设为true    
            }    
        }    
          
        // 如果内层循环结束时,swapped仍然为false,说明数组已经是有序的,直接退出外层循环  
        if (!swapped) break; // 如果内层循环结束时,swapped仍然为false,说明数组已经是有序的,直接退出外层循环    
    }    
}

升/降 序通用

// 定义一个函数 BubbleSort,接受一个整数数组 arr,数组的大小 size,和一个比较函数 cmp 作为参数。这个函数用来对数组进行冒泡排序。  
void  BubbleSort(int arr[], int size, bool(*cmp)(const int&, const int&)) {  
  
    // 检查传入的比较函数是否为空。如果为空,则直接返回,不进行任何操作。  
    if (cmp == nullptr) {  
        return;  
    }  
  
    // 开始进行外层循环,从数组的第一个元素到倒数第二个元素(i 从 0 到 size-2)  
    for (int  i = 0; i < size-1; i++){  
  
        // 定义一个布尔变量 IsSort,初始值为 true。这个变量用来检查数组是否已经有序。  
        bool IsSort = true;  
  
        // 进行内层循环,从数组的第二个元素开始到倒数第三个元素(j 从 0 到 size-1-i)  
        for (int j= 0; j < size-1-i; j++){  
  
            // 使用比较函数 cmp 来判断 arr[j] 是否大于 arr[j + 1]。如果大于,则交换这两个元素的位置,并将 IsSort 设为 false。  
            if (cmp(arr[j], arr[j + 1])) {  
                swap(arr[j], arr[j + 1]);  
                IsSort = false;  
            }  
        }  
  
        // 如果 IsSort 仍然为 true,说明这个位置的元素已经是有序的,可以结束内层循环。  
        if (IsSort)	{  
            break;  
        }  
    }  
}  
  
// 定义一个函数 GreaterCmp,接受两个整数作为参数,如果第一个整数大于第二个整数,返回 true,否则返回 false。这个函数用于比较两个整数的大小。  
bool GreaterCmp(const int& val1, const int &val2) {  
    return val1 > val2;  
}  
  
// 定义一个函数 LessCmp,接受两个整数作为参数,如果第一个整数小于第二个整数,返回 true,否则返回 false。这个函数用于比较两个整数的大小。  
bool LessCmp(const int& val1, const int& val2) {  
    return val1 < val2;  
}

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

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

相关文章

Vue安装及环境配置详细教程

一、下载node.js 访问node.js官网&#xff1a;Download | Node.js 选择Windows Installer (.msi)的64-bit进行下载。 在E盘新建一个文件夹&#xff0c;取名为nodejs&#xff0c;也可以在其他盘符新建。 在安装node.js时&#xff0c;点击Change...&#xff0c;进行切换盘符安…

【UE】UEC++获取屏幕颜色GetPixelFromCursorPosition()

目录 【UE】UE C 获取屏幕颜色GetPixelFromCursorPosition() 一、函数声明与定义 二、函数的调用 三、运行结果 【UE】UE C 获取屏幕颜色GetPixelFromCursorPosition() 一、函数声明与定义 创建一个蓝图方法库方法 GetPixelFromCursorPosition()&#xff0c;并给他指定UF…

循环队列的结构设计和基本操作的实现(初始化,入队,出队,判空,获取长度,清空,销毁)

目录 1.队列的定义 2.循环队列的设计图示 3.循环队列的结构设计 4.循环队列的实现 5.循环队列的总结 1.队列的定义 和栈相反,队列(queue)是一种先进先出(first in first out,缩写为FIFO)的线性表.它只允许在表的一端进行插入,而在另一端删除元素. 在队列中,允许插入的一…

[二分查找]LeetCode2009 :使数组连续的最少操作数

本文涉及的基础知识点 二分查找算法合集 作者推荐 动态规划LeetCode2552&#xff1a;优化了6版的1324模式 题目 给你一个整数数组 nums 。每一次操作中&#xff0c;你可以将 nums 中 任意 一个元素替换成 任意 整数。 如果 nums 满足以下条件&#xff0c;那么它是 连续的 …

【动态规划】LeetCode-91.解码方法

&#x1f388;算法那些事专栏说明&#xff1a;这是一个记录刷题日常的专栏&#xff0c;每个文章标题前都会写明这道题使用的算法。专栏每日计划至少更新1道题目&#xff0c;在这立下Flag&#x1f6a9; &#x1f3e0;个人主页&#xff1a;Jammingpro &#x1f4d5;专栏链接&…

【计算机网络笔记】802.11无线局域网

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

【海思SS528 | VO】MPP媒体处理软件V5.0 | VO模块编程总结

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

<DB2>《AIX服务器DB2数据库裸设备表空间扩容方案》

《AIX服务器DB2数据库裸设备表空间扩容方案》 1 表空间状态查看1.1 连接数据库&#xff08;实例用户操作&#xff09;1.2 查看表空间剩余&#xff08;实例用户操作&#xff09;1.3 查看所属表空间的容器属性&#xff08;实例用户操作&#xff09; 2 VG状态和LV状态查看2.1 查看…

Python 爬虫 之scrapy 框架

文章目录 常用的命令开始爬虫请求与响应让控制台只输出想要的信息创建一个py 文件来帮忙运行爬虫 工作原理图实战 常用的命令 Scrapy是一个用于爬取网站数据的Python框架&#xff0c;以下是一些常用的Scrapy命令&#xff1a; 开始的时候 用 cd 进入你想创建scrapy 的文件夹 &a…

EasyExcel写入多个sheet

直接上代码&#xff1a; public static void main(String[] args) {// 设置excel工作簿ExcelWriter excelWriter EasyExcel.write("F:\\excel\\a.xls").build();List<User> userList new ArrayList<>();userList.add(new User("lisi", "…

QT 中使用 QTableView 和 QStandardItemModel 实现将数据导出到Excel 和 从Excel导入到 QTableView 的功能

简介 在Qt中&#xff0c;使用QTableView和QStandardItemModel来实现将数据导出到Excel和从Excel导入到QTableView的功能&#xff0c;而不使用第三方库&#xff08;如QXlsx&#xff09;。 效果 将 QTableView 中的数据导出到Excel //从tableview 导出到 EXcle void MainInterfa…

数据结构第7次练习-图(基础篇)

一&#xff1a;判断题 1-1 答案&#xff1a;T 解析&#xff1a;c到a的最短路径是12214&#xff0c;所以是大于10的 1-2 答案&#xff1a;T 一个连通分量要进行一次广度优先搜索 1-3 答案&#xff1a;F 解析&#xff1a;是存在等于顶点的个数减一的情况&#xff0c;比如三个顶点…

六、ZooKeeper Java API操作

目录 1、引入maven坐标 2、节点的操作 这里操作Zookeeper的JavaAPI使用的是一套zookeeper客户端框架 Curator ,解决了很多Zookeeper客户端非常底层的细节开发工作 。 Curator包含了几个包:

【大数据】HBase 中的列和列族

&#x1f60a; 如果您觉得这篇文章有用 ✔️ 的话&#xff0c;请给博主一个一键三连 &#x1f680;&#x1f680;&#x1f680; 吧 &#xff08;点赞 &#x1f9e1;、关注 &#x1f49b;、收藏 &#x1f49a;&#xff09;&#xff01;&#xff01;&#xff01;您的支持 &#x…

GODOC命令无效,原因是需要手动安装

在看《GO程序设计语言》这本书&#xff0c;按照其中的内容&#xff0c;想看下GO自带的包的文档。 书中讲&#xff0c;可以直接输入GoDOC命令来打开一个服务器&#xff0c;从而可以用浏览器访问文档库。输入命令后&#xff0c;系统提示找不到该命令。 查了资料后才发现&#xff…

如何使用vue组件

目录 1&#xff1a;组件之间的父子关系 2&#xff1a;使用组件的三个步骤 3&#xff1a;components组件的是私有子组件 4&#xff1a;在main.js文件中使用Vue.component全局注册组件 1&#xff1a;组件之间的父子关系 一&#xff1a;首先封装好的组件是不存在任何的关系的…

国际语音群呼系统的产品优势有哪些?为什么要使用国际语音群呼系统?

一、国际语音群呼系统的产品优势&#xff1a; 1.巨量群呼 支持大容量并发群呼&#xff0c;呼叫不受限制&#xff0c;充裕的线路保障造就百万级平台容量&#xff0c;可以短时间内同时拨打大量电话&#xff0c;让语音快速到达&#xff0c;大大提高发送效率&#xff1b; 2.自主…

【重点】【哈希】128.最长连续序列

题目 思路&#xff1a;https://leetcode.cn/problems/longest-consecutive-sequence/solutions/2362995/javapython3cha-xi-biao-ding-wei-mei-ge-l-xk4c/?envTypestudy-plan-v2&envIdtop-100-liked class Solution {public int longestConsecutive(int[] nums) {Set<…

Spring之RestTemplate详解

Spring之RestTemplate详解 1 RestTemplate1.1 引言1.2 环境配置1.2.1 非Spring环境下使用RestTemplate1.2.2 Spring环境下使用 RestTemplate1.2.3 Spring环境下增加线程号 1.3 API 实践1.3.1 GET请求1.3.1.1 不带参请求1.3.1.2 带参的get请求(使用占位符号传参)1.3.1.3 带参的g…