1.8.7 练习 冒泡排序 Bubble Sort(提取函数)

C++自学精简教程 目录(必读)

1 前驱知识点

for循环语句 、 if语句、函数 、动态内存

2 排序

是将元素按照从小到大的顺序存放的方法。

一开始元素可能并不是按照从小到大的顺序存放的。

这时候我们需要找到需要调整的元素对,并交换这两个元素的值,不断重复这个过程,最终让所有元素都按照从小到大的顺序存放。

3 冒泡排序

Bubble Sort 是一种思路很简单的排序方法。

冒泡的是指当前待排序的序列中元素最大的那个元素,我们找到这个元素,并把这个元素放到最后一个位置,那么最大的元素就已经排好序了(冒泡了)。

这时候再将剩下的元素序列用同样的方法处理,就会出现所有元素中第二大的元素冒泡,第3大的元素冒泡,一直到最后一个元素不用冒泡了。全部元素就排好序了。

待排序数据

49,38,65,97,76,13,27,49

过程见下图

第一趟冒泡,把最大值97放到最下面

第二趟冒泡,把第二大的76放到倒数第二位置

最后一趟排序,所有元素已经排好顺序

4 代码实现

4.1 普通代码实现(眉毛胡子一把抓)

下面的代码只用了一个BubbleSort函数,代码都集中在这一个函数里,细节很多,比较容易写错。

#include <iostream>
using namespace std;

void BubbleSort(int* arr, int n)
{
    for (int i = 0; i < n; i++) { // i-th pass
        for (int j = 1; j < n-i; j++) {
            if (arr[j - 1] > arr[j]) { // swap if out of order
                //(1) your code 
                // swap arr[j-1] and arr[j]
            }
        }
    }
}

int main()
{
    int n = 8;
    int* arr = new int[n]{49,38,65,97,76,13,27,49};//申请8个int变量,并初始化

    //执行排序
    BubbleSort(arr, 8);

    //输出排序后的序列
    for (int i = 0; i < n; i++)
    {
        cout << arr[i] << " ";
    }
    delete[] arr;//释放动态数组需要用delete[]
    return 0;
}

输出结果:

数据已经排好序

4.2 使用更多函数

让代码更清晰的方法!

我们将冒泡函数Bubble提出出来,交换两个变量的值的函数Swap也提取出来,代码一下子简单了很多。

#include <iostream>
using namespace std;

//打印数组中的每一个元素
void print_array(int* arr, int length)
{
    for (int i = 0; i < length; i++)
    {
        cout << arr[i] << " ";
    }
    cout << endl;
}

//swap two number
void Swap(int& a, int& b)
{
    int tmp = a; a = b; b = tmp;
}

//put max element to the end
void Bubble(int* arr, int length)
{
    for (int j = 1; j < length; j++) {
        if (arr[j - 1] > arr[j]) { // swap if out of order [j-1] and [j]
            //(2) your code
           
        }
    }
}

void BubbleSort(int* arr, int n)
{
    for (int i = 0; i < n; i++) { // i-th pass
        Bubble(arr, n - i);//put max element to the end
        print_array(arr, n);
    }
}

int main()
{
    int n = 8;
    int* arr = new int[n] {49, 38, 65, 97, 76, 13, 27, 49};//申请8个int变量,并初始化

    //执行排序
    BubbleSort(arr, 8);

    //输出排序后的序列
    for (int i = 0; i < n; i++)
    {
        cout << arr[i] << " ";
    }
    delete[] arr;//释放动态数组需要用delete[]
    return 0;
}

输出结果:

每一趟的排序结果

4.3 使用仿函数

将比较两个整数的功能单独用一个仿函数来实现。

#include <iostream>
#include <functional>
using namespace std;


//打印数组中的每一个元素
void print_array(int* arr, int length);


//swap two number
void Swap(int& a, int& b)
{
    int tmp = a; a = b; b = tmp;
}

//put max element to the end
void Bubble(int* arr, int length, function<bool(int, int)>& compare)
{
    for (int j = 1; j < length; j++) {
        if (!compare(arr[j - 1], arr[j])) { // swap if out of order [j-1] and [j]
            //(2) your code
            Swap(arr[j - 1], arr[j]);
        }
    }
}

void BubbleSort(int* arr, int n, function<bool(int, int)>& compare)
{
    for (int i = 0; i < n; i++) { // i-th pass
        Bubble(arr, n - i, compare);//put max element to the end
        print_array(arr, n);
    }
}

int main()
{
    int n = 8;
    int* arr = new int[n] {49, 38, 65, 97, 76, 13, 27, 49};//申请8个int变量,并初始化
    function<bool(int, int)> compare = [](int a, int b) { return a < b; };//升序
    //执行排序
    BubbleSort(arr, 8, compare);

    //输出排序后的序列
    for (int i = 0; i < n; i++)
    {
        cout << arr[i] << " ";
    }
    delete[] arr;//释放动态数组需要用delete[]
    return 0;
}

//打印数组中的每一个元素
void print_array(int* arr, int length)
{
    for (int i = 0; i < length; i++)
    {
        cout << arr[i] << " ";
    }
    cout << endl;
}

输出结果:

38 49 65 76 13 27 49 97
38 49 65 13 27 49 76 97
38 49 13 27 49 65 76 97
38 13 27 49 49 65 76 97
13 27 38 49 49 65 76 97
13 27 38 49 49 65 76 97
13 27 38 49 49 65 76 97
13 27 38 49 49 65 76 97
13 27 38 49 49 65 76 97

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

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

相关文章

java遇到java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver该如何解决

普通的Java项目&#xff0c;利用servlet实现登录页面跳转出现下列问题。该如何解决&#xff1f;&#xff1f;&#xff1f; 首先你要先加载驱动&#xff0c;idea通过项目结构添加的依赖包是无法正常加载驱动的。我们要在 WEB-INF目录下建立lib目录在lib目录下添加MySQL驱动。

代码随想录算法训练营第31天 | ● 理论基础 ● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和

文章目录 前言一、理论基础二、455.分发饼干三、376. 摆动序列四、53. 最大子序和总结 前言 贪心。 一、理论基础 贪心没有套路&#xff0c;说白了就是常识性推导加上举反例。 贪心算法一般分为如下四步&#xff1a; 将问题分解为若干个子问题找出适合的贪心策略求解每一个子问…

Bigemap 在水土生态环境行业中的应用

工具 Bigemap gis office地图软件 BIGEMAP GIS Office-全能版 Bigemap APP_卫星地图APP_高清卫星地图APP 使用场景&#xff1a; 1. 土地利用占地管理&#xff1a; 核对数据&#xff0c;查看企业的实际占地是否超出宗地&#xff0c;污染面积。不方便现场勘测的地方&#xf…

2017. 网格游戏;2397. 被列覆盖的最多行数;2202. K 次操作后最大化顶端元素

2017. 网格游戏 核心思想&#xff1a;前缀和枚举。读完题后可以发现&#xff0c;第一个机器人走的路线就像一条分割线&#xff0c;第二个机器人只能获得上面白色部分或者下面白色部分的最大值。这个最大值怎么求&#xff0c;我们可以通过前缀和来求&#xff0c;然后通过枚举转…

导入excel数据给前端Echarts实现中国地图-类似热力图可视化

导入excel数据给前端Echarts实现中国地图-类似热力图可视化 程序文件&#xff1a; XinqiDaily/frontUtils-showSomeDatabaseonMapAboutChina/finalproject xin麒/XinQiUtilsOrDemo - 码云 - 开源中国 (gitee.com) https://gitee.com/flowers-bloom-is-the-sea/XinQiUtilsOr…

IDEA 报 Cannot resolve symbol ‘HttpServletResponse‘ 解决

springboot2版本换成springboot3之后&#xff0c;代码这里突然报红了&#xff0c; 首先要淡定&#xff0c;把原先Import的引入删掉&#xff0c;重新引入试试呢&#xff0c;是不是很简单哈哈。 原来&#xff0c;springboot3的路径是&#xff1a; import jakarta.servlet.http…

1773_把vim的tab键设置为4个空格显示

全部学习汇总&#xff1a; GitHub - GreyZhang/editors_skills: Summary for some common editor skills I used. 有时候自己觉得自己很奇怪&#xff0c;看着Linux的命令窗口就觉得很顺眼。那些花花绿绿的字符以及繁多的方便命令工具&#xff0c;确实是比Windows强不少。不过&a…

Python学习 -- 根类object

在Python编程中&#xff0c;所有的类都继承自一个根类&#xff0c;名为object。这个根类提供了许多基本的特性和方法&#xff0c;为其他类的创建和使用提供了基础。本文将深入探讨object类&#xff0c;介绍其重要特性和用法&#xff0c;并通过代码示例进行详细解释。 1. 什么是…

C++day3(类、this指针、类中的特殊成员函数)

一、Xmind整理&#xff1a; 二、上课笔记整理&#xff1a; 1.类的应用实例 #include <iostream> using namespace std;class Person { private:string name; public:int age;int high;void set_name(string n); //在类内声明函数void show(){cout << "na…

【Linux】序列化与反序列化

目录 前言 什么是应用层&#xff1f; 再谈"协议" 什么是序列化和反序列化 网络版计算器 整体流程实现 Sock.hpp的实现 TcpServer.hpp的实现 Protocol.hpp的实现 CalServer.cc的编写 CalClient.cc的编写 整体代码 前言 本章是属于TCP/UDP四层模型中的第一层…

使用 Python编程: 下载 YouTube 音频的桌面应用程序

最近我开发了一个使用 Python 编写的桌面应用程序&#xff0c;可以方便地下载 YouTube 音频。该应用程序使用了 wxPython、yt_dlp 和 tqdm 库&#xff0c;提供了一个简单直观的用户界面&#xff0c;并具备高效的下载功能。 C:\pythoncode\new\youtube-dl-audio.py 程序介绍 …

Java实现根据关键词搜索当当商品列表数据方法,当当API接口申请指南

要通过当当网的API获取商品列表数据&#xff0c;您可以使用当当开放平台提供的接口来实现。以下是一种使用Java编程语言实现的示例&#xff0c;展示如何通过当当开放平台API获取商品列表&#xff1a; 首先&#xff0c;确保您已注册成为当当开放平台的开发者&#xff0c;并创建…

Ansible学习笔记10

1、在group1的被管理机里的mariadb里创建一个abc库&#xff1b; 1&#xff09; 然后我们到agent主机上进行检查&#xff1a; 可以看到数据库已经创建成功。 再看几个其他命令&#xff1a; #a组主机重启mysql&#xff0c;并设置开机自启 ansible a -m service -a "namemy…

Hive-启动与操作(2)

&#x1f947;&#x1f947;【大数据学习记录篇】-持续更新中~&#x1f947;&#x1f947; 个人主页&#xff1a;beixi 本文章收录于专栏&#xff08;点击传送&#xff09;&#xff1a;【大数据学习】 &#x1f493;&#x1f493;持续更新中&#xff0c;感谢各位前辈朋友们支持…

初始react和使用——事件处理、样式处理和组件

一、react官网 1、官网下载 官网分别有中英文两种&#xff1a; 中文官网&#xff1a;React 官方中文文档 – 用于构建用户界面的 JavaScript 库 英文官网&#xff1a;https://reactjs.org/ 2、react简介 react是用于构建用户界面的JavaScript库&#xff0c;起源于Facebook的…

【【STM32分析IO该设置什么模式的问题】】

STM32分析IO该设置什么模式的问题 我们分析而言 我们对于PA0 的设计就从此而来 对于边沿触发的选择我们已经有所了解了 我们下拉&#xff0c;但是当我们摁下开关的时候 从0到1 导通了 所以这个是下拉 上升沿触发 而对于KEY0 我们摁下是使得电路从原来悬空高阻态到地就是0 所以…

WordPress(3)会员插件安装

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、服务器中上传插件二、使用步骤1.启动插件前言 提示:会员插件的安装不能在网站后台插件中心中直接安装原因我还没有排查 原因:会导致网站停止运行 一、服务器中上传插件 二、使用步骤 …

Servlet的使用(JavaEE初阶系列17)

目录 前言&#xff1a; 1.Servlet API的使用 1.1HttpServlet 1.2HttpServletRequest 1.3HttpServletResponse 2.表白墙的更新 2.1表白墙存在的问题 2.2前后端交互接口 2.3环境准备 2.4代码的编写 2.5数据的持久化 2.5.1引入JDBC依赖 2.5.2创建数据库 2.5.3编写数…

根据身高重建队列【贪心算法】

根据身高重建队列 假设有打乱顺序的一群人站成一个队列&#xff0c;数组 people 表示队列中一些人的属性&#xff08;不一定按顺序&#xff09;。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi &#xff0c;前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新构造并返…

设计模式的使用——模板方法模式+动态代理模式

一、需求介绍 现有自己写的的一套审批流程逻辑&#xff0c;由于代码重构&#xff0c;需要把以前的很多业务加上审批的功能&#xff0c;再执行完审批与原有业务之后&#xff0c;生成一个任务&#xff0c;然后再统一处理一个任务&#xff08;本来是通过数据库作业去处理的&#x…