当前位置: 首页 > news >正文

C:冒泡排序

1e0f36d95fb04c78a598e20fa1049156.jpg

1、冒泡排序介绍:

冒泡排序的核心思想就是:两两相邻的元素进行比较。

先用一个例子来帮助大家理解一下冒泡排序的算法是怎们进行的

有一排高矮不同的人站成一列,要按照从矮到高的顺序重新排队。

冒泡排序的方法就是,从第一个人开始,依次两两比较相邻的两个人的身高。如果左边的人比右边的高,就交换他们的位置。

这样一轮下来,最高的人就像气泡一样“浮”到了最右边。

然后再从头开始,重复刚才的比较和交换,让第二高的人“浮”到右边第二个位置。

就这样一轮一轮地比较和交换,直到所有人都排好序。

2、不使用函数的冒泡排序:

代码展示:

#include <stdio.h>
int main(){int arr[] = { 100,99,3,45,12,55,88,22,13,19 };//随机输入的数字int i = 0;int sz = sizeof arr / sizeof(arr[0]);//求数组中的元素个数for ( i = 0; i < sz - 1; i++){//总趟数int j = 0;for (j = 0; j < sz - 1 - i; j++){//一趟冒泡排序if (arr[j] > arr[j + 1]){//交换两数int k = arr[j];arr[j] = arr[j + 1];arr[j + 1] = k;}}}	for (i = 0; i < sz; i++){printf("%d ", arr[i]);}//实现排序后的数组打印return 0;}

 结果展示:

b20175b7e8f14278870c90000fb412be.png

2.1 sz的解释:

int sz = sizeof arr / sizeof(arr[0]);

这行代码用于计算数组 arr 中的元素个数。

 sizeof是 C 语言中的一个操作符,用于获取数据类型或者变量所占用的字节数。

 sizeof arr 会返回整个数组所占用的字节数。

 sizeof(arr[0]) 会返回数组中单个元素所占用的字节数。

然后用整个数组占用的字节数除以单个元素占用的字节数,就得到了数组中元素的个数,并将其存储在变量 sz  中。

例如,如果  arr  是一个 int 类型的数组,每个 int 类型通常占用 4 个字节。假设整个数组占用了 40 个字节,那么sz = 40 / 4 = 10 ,即数组中有 10 个元素。

这样做的好处是,即使数组的大小在不同的情况下可能会发生变化,通过这种方式计算元素个数可以提高代码的可维护性和通用性,避免了重复编码数组的大小。

2.2 i  < sz - 1  和 j < sz-1-i 的解释

这里的 i 是进行冒泡排序的总趟数,sz - 1是因为对于一个含有sz个元素的数组,进行 sz - 1 趟冒泡排序就可以完成排序。

这里的 j 是进行一次冒泡排序所要交换的次数, sz-1-i 用于控制每一趟冒泡排序中比较和交换的次数。

以包含 5 个元素的数组为例:

第一趟需要比较 4 次(即 sz-1),因为要把最大的数“浮”到最后位置。

第二趟只需要比较 3 次(即 sz-1-1),因为最大的数已经在最后,不用再参与比较。

第三趟比较 2 次(即 sz-1-2)。

第四趟比较 1 次(即 sz-1-3)。

这样,每一趟比较的次数逐渐减少,通过这种方式可以在经过一定的趟数后完成整个数组的排序。

3、使用函数的冒泡排序:

#include <stdio.h>
void bublle_sort(int arr[], int sz)//实现冒泡排序
{for(int i = 0; i < sz - 1; i++)//总趟数{   //一趟冒泡排序for (int j = 0; j < sz-1-i; j++){if (arr[j] > arr [j + 1] )//相邻两数比较大小{int k = arr[j];arr[j] = arr[ j + 1];arr[j + 1] = k;}}}
}
void printf_arr(int arr[], int sz)//打印排序后的值
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}printf("\n");
}
int main()
{int arr[] = { 2,3,4,5,6,7,1,8,9,10 };//这里的整数是可以任意输入的,不限数量//写一个函数,实现冒泡排序//假设为升序排列int sz = sizeof arr / sizeof(arr[0]);//求数组中元素的个数bublle_sort(arr, sz);//实现冒泡排序printf_arr(arr, sz);//实现打印排序后的值return 0;
}

这里就比上面那个多了两个函数,里面注释写的还是比较清楚的,可以看一看

4、关于函数冒泡排序的代码改进

void bublle_sort(int arr[], int sz)//实现冒泡排序
{for(int i = 0; i < sz - 1; i++)//总趟数{   //一趟冒泡排序for (int j = 0; j < sz-1-i; j++){if (arr[j] > arr [j + 1] )//相邻两数比较大小{int k = arr[j];arr[j] = arr[ j + 1];arr[j + 1] = k;}}}
}

关于冒泡排序的次数,上述这组代码不管所给的数字是什么顺序排列的,想要改为升序都需要进行45组两数相比,如果所要排序的数组是乱序的话45次还能接受,但是如果所给的顺序是

9 0 1 2 3 4 5 6 7 8

像上述这种顺序改为升序仅仅只需要将9移动到最后一位即可,也就是说只需要一趟冒泡排序即可完成。但是,向上面的代码,当第一趟冒泡排序结束后,会紧接着进行下一趟冒泡排序。虽然排序已经完成,但是后面依旧会继续比较,虽然数字不会再交换顺序。因此,向这种情况我们应该怎么改进呢?

#include <stdio.h>
void bublle_sort(int arr[], int sz)
{
    for(int i = 0; i < sz - 1; i++)//总趟数
    {   //一趟冒泡排序
        int flag = 1;//假设已经有序了
        for (int j = 0; j < sz-1-i; j++)
        {
            if (arr[j] > arr [j + 1] )
            {
                int k = arr[j];
                arr[j] = arr[ j + 1];
                arr[j + 1] = k;
                flag = 0;//说明其中发生了交换,假设不成立
            }
        }
        if (flag == 1)//说明假设成立
        {
            break;//跳出循环
        }
    }
}

 看上面被标红的代码,当我们这样优化后,可以减少多余的循环,提高效率。

5、使用指针的冒泡排序:

先补充几个知识点:

数组的数组名arr就是首元素地址,所以我们传参传的其实就是首元素地址bublle_sort(arr, sz);

我们将形参改写为指针,通过指针找回来的还是main函数里的原数组

主函数里的数组传递给冒泡排序函数,冒泡函数里使用的数组依然是主函数里的数组,这是因为数组传参传的是它的地址。

使用指针标识的冒泡函数

#include <stdio.h>                                                               
void bublle_sort(int* arr, int sz)//实现冒泡排序
{for (int i = 0; i < sz - 1; i++)//总趟数{   //一趟冒泡排序int flag = 1;for (int j = 0; j < sz - 1 - i; j++){if (*(arr + j) > *(arr + j + 1))//相邻两数比较大小{int k = *(arr+j);*(arr + j) = *(arr + j + 1);*(arr + j + 1) = k;flag = 0;}}if (flag == 1){break;}}
}
void printf_arr(int* arr, int sz)//打印排序后的值
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", *(arr + i));}printf("\n");
}
int main()
{int arr[] = { 2,3,4,5,6,7,1,8,9,10 };//写一个函数,实现冒泡排序//假设为升序排列int sz = sizeof arr / sizeof(arr[0]);bublle_sort(arr, sz);//实现冒泡排序printf_arr(arr, sz);//实现打印排序后的值return 0;
}

结语:

本篇文章到这里就先结束了,期待大家的的阅读!!!

 

 

 

相关文章:

C:冒泡排序

1、冒泡排序介绍&#xff1a; 冒泡排序的核心思想就是&#xff1a;两两相邻的元素进行比较。 先用一个例子来帮助大家理解一下冒泡排序的算法是怎们进行的 有一排高矮不同的人站成一列&#xff0c;要按照从矮到高的顺序重新排队。 冒泡排序的方法就是&#xff0c;从第一个人…...

探秘C# LINQ元素运算:原理阐释与实践指南

文章目录 一、LINQ元素运算符概述二. ElementAt 和 ElementAtOrDefault三. First 和 FirstOrDefault四. Last 和 LastOrDefault五. Single 和 SingleOrDefault六. Where 和 Select七、实际应用场景示例总结 LINQ&#xff08;Language-Integrated Query&#xff09;是C#中强大且…...

根据bean的名称获取bean,静态方法查询数据库

根据bean名称获取bean 1.先创建bean&#xff0c;如template package com.test.game.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.core.JdbcTemplate;import…...

剪画小程序:音频剪辑新手入门:基础操作指南!

亲爱的小伙伴们&#xff0c;你是否对音频剪辑充满好奇&#xff0c;却不知道从何下手&#xff1f;今天&#xff0c;就让我们用【剪画】一起揭开音频剪辑基础操作的神秘面纱&#xff01; 音频拼接——打造个性音乐串烧 音频拼接是将多个音频片段组合在一起&#xff0c;创造出独特…...

IDEA中maven jar下载失败问题处理

前言 对于在IDEA中maven爆红问题&#xff0c;主要分为两类&#xff0c;一个是全部爆红&#xff0c;一个是部分爆红。 全部爆红 这类问题主要是maven配置没有搞好&#xff0c;可以根据下列步骤自查 1.配置好国内的Maven源 第一步:打开IDEA&#xff0c;查看配置 第二步: 检查…...

C++中,函数返回const类型有什么作用,请举例说明

在C中&#xff0c;函数返回const类型的主要作用是确保返回的对象不会被修改。这种保护机制增强了代码的健壮性和可维护性&#xff0c;尤其是在你希望保证函数返回的数据不被意外篡改时。下面通过几个例子来说明函数返回const类型的作用。 例子 1: 返回常量引用 当你从函数中返…...

Html详解——Vue基础

HTML是什么&#xff1f; 超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称&#xff1a;HTML&#xff09;是一种用来结构化 Web 网页及其内容的标记语言。网页内容可以是&#xff1a;一组段落、一个重点信息列表、也可以含有图片和数据表…...

【安规电容知识点总结】

安规电容知识点总结 安规电容简介安规电容的种类X电容和Y电容X电容和Y电容示意图安规电容的型号与应用安规电容简介 安规电容:是指用于这样的场合,即电容器失效后,不会导致电击,不会危及到人身安全。 具体来说,所谓安规电容是一种与普通电容相比符合安全认证的电容,故称…...

R9000P 双系统安装 win11 和 ubuntu

网上了解到一堆关于 r9000p 安装较老的ubuntu系统&#xff0c;会有一堆问题 可能是电脑硬件比较新&#xff0c;较老的系统相关方面不兼容 那么干脆直接装新一点的系统 我安装了 Ubuntu 22.04 1 根据相关教程利用u盘制作系统盘 ultraISO 推荐使用清华源 速度快一点 https://…...

8月8日笔记

8月8日笔记 msf常见命令 启动MSF控制台 msfconsole: 启动MSF控制台。msfconsole -h: 显示帮助菜单。msfconsole -q: 启动MSF控制台并立即退出。 导航和管理 back: 返回上一级菜单。exit: 退出MSF控制台。banner: 显示MSF的横幅。cd: 更改工作目录。color: 开启或关闭彩色输…...

【单片机开发软件】使用VSCode开发STM32环境搭建

&#x1f48c; 所属专栏&#xff1a;【单片机开发软件技巧】 &#x1f600; 作  者&#xff1a; 于晓超 &#x1f680; 个人简介&#xff1a;嵌入式工程师&#xff0c;专注嵌入式领域基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大家&#xff1…...

第十五届蓝桥杯大赛青少组——赛前解析(算法)

算法&#xff1a;进制转换、模拟算法&#xff0c;枚举算法&#xff0c;冒泡排序&#xff0c;插入排序&#xff0c;选择排序&#xff0c;递推算法&#xff0c;递归算法&#xff0c;贪心算法。 1.进制转换 二进制&#xff1a;只包含0和1 八进制&#xff1a;只包含0-7 十进制&…...

工作助手C#研究笔记(5)

通过示例对C#程序的结构逻辑进行研究梳理&#xff0c;虽然通过阅读相关书籍&#xff0c;但是来的效果更慢。一下相关内容可能有误&#xff0c;请谨慎听取。 TaskToDoList-master 1.XAML “XAML”是WPF中专门用于设计UI的语言&#xff0c;优点是 1.XAML可以设计出专业的UI和…...

【kali靶机之serial】--反序列化漏洞实操

kali靶机配置 【我图片里没有截图的默认配置即可】需要改的地方图片里面都有。 使用kali扫描网关的主机。 扫到一个开放了80端口HTTP协议的主机ip 访问80端口 会看到一个文本页面&#xff0c;翻译一下看是什么意思。。 F12查看cookie&#xff0c;是一个base64编码了的东西 使…...

学习大数据DAY34 面向对象思想深化练习 将从豆瓣爬取的数据置入自己搭建的网站上

目录 查看电影类型的电影列表 添加电影 修改电影 上机练习 13 使用三层架构完善 web 系统 查看电影类型的电影列表 DAL.py 文件 class MovieDAL(DBHelper): def getMovieByTid(self,typeid): sqlf"""select id,title,release_date,score,tname from Mo…...

【开端】通过Java 过滤器灵活配置URL访问权限,并返回403

一、绪论 在JAVA项目系统中&#xff0c;后端给前端提供接口。但是在某些场景我们需要临时控制接口是否能被访问。或关闭某一接口的访问权限。 比如某一接口被攻击了或者某一接口存在漏洞&#xff0c;在系统不关闭的情况下&#xff0c;如何控制系统的访问权限。 二、控制接口访…...

【C++综合项目】——基于Boost库的搜索引擎(手把手讲解,小白一看就会!!)

目录 一、前言 二、项目的相关背景 ⚡什么是Boost库&#xff1f;⚡ ⚡什么是搜索引擎&#xff1f;⚡ ⚡为什么要做Boost搜索引擎&#xff1f;⚡ 二、搜索引擎的宏观原理 三、搜索引擎技术栈和项目环境 四、正排索引 VS 倒排索引 —— 搜索引擎的具体原理 &#x…...

强化阶段《660》和《880》哪本优先级高?

现在8月份了&#xff0c;正是考研数学复习的关键时刻&#xff0c;大家应该正在痛快的刷题&#xff01; 如果你正在做660880&#xff0c;那么这篇笔记值得花五分钟看完&#xff0c;一定会让你刷660和880的质量和速度提高一个层次&#xff01; 首先我们要知道660和880都怎么用&…...

Redis远程字典服务器(2) —— 全局命令

一&#xff0c;使用官方文档 学会使用文档&#xff0c;是一个优秀程序员的必备技能。Redis的命令非常多&#xff08;上百个&#xff09;&#xff0c;因为Redis是通过键值对存储数据的&#xff0c;key为string类型&#xff0c;但是value可以是其它的数据类型&#xff08;字符串…...

Android平台如何不推RTMP|不发布RTSP流|不实时录像|不回传GB28181数据时实时快照?

技术背景 我们知道&#xff0c;Android平台不管RTMP推送、轻量级RTSP服务模块还是GB28181设备接入模块&#xff0c;早期&#xff0c;如果需要实现截图功能&#xff0c;又不想依赖Android系统接口&#xff0c;最好的办法是&#xff0c;在底层实现快照截图。 快照截图&#xff…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...