排序 Bubble Sort(提取函数)

news2024/12/23 20:20:29

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

1 前驱知识点

3.5 for循环语句 3.6 if语句 3.7 函数 3.8 动态内存

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

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

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

相关文章

葫芦娃自动预约-公众号代挂

效果 #小程序://航旅黔购/1nkYlNRVzm0Gg9x #小程序://贵旅优品/7zz6mtnSVgDfyqa #小程序://新联惠购/ibFdsuhWqIbczEd #小程序://贵盐黔品/u2TgExCUdkavrFe #小程序://空港乐购/ANkOOdqEeo71kah #小程序://遵航出山/ZkR7DQy1raoPxKD #小程序://乐旅商城/Ip5cgpJ7TLmRrWF #小程序…

pip安装报错解决办法

pip install 包名&#xff0c;报错如下&#xff1a; 试了很多网上的办法&#xff0c;不管用&#xff0c;依旧报错。这些方法包括&#xff0c;添加镜像源&#xff0c;更改镜像源&#xff0c;添加全局镜像源host&#xff1b;关闭VPN等等。 最终发现靠修改ProxyEnable有用&#x…

gif动态图片如何制作的?一个方法教你快速生成gif

我们在使用聊天软件聊天时&#xff0c;经常会用到gif格式的动态表情包非常的有趣。当我们想要自己制作一些专属自己的表情包的时候要怎么制作呢&#xff1f;接下来&#xff0c;给大家分享一款操作简单的gif在线制作&#xff08;https://www.gif.cn/&#xff09;工具&#xff0c…

产品经理竞品分析的6大注意事项

1、明确竞品分析目的 在做竞品分析之前&#xff0c;需要明确分析的目的。因为不同的目的所采用的分析方法不同。在了解产品处于的阶段以及竞品分析的目标后&#xff0c;才开始进行竞品分析。 如我们想提高销售额&#xff0c;需围绕广告投放方法、策略等内容进行重点分析&#x…

用友畅捷通TPlus DownloadProxy.aspx任意文件读取漏洞+远程命令执行漏洞

文章目录 前言 一.用友畅捷通TPlus DownloadProxy.aspx任意文件读取漏0x01 漏洞描述0x02 影响版本0x03 漏洞环境0x04 漏洞复现1.构造POC 0x05 修复建议 二.用友畅捷通TPlus远程命令执行漏洞0x01 漏洞描述0x02 影响版本0x03 漏洞环境0x04 漏洞复现1.构造POC2.看DNSlog回显 0x05 …

康希诺:跌跌更有钱途,此时已是关注良机

这几年医药行业二级市场的回报率不理想&#xff1b;动不动的集采大降价&#xff0c;可能使得某些公司的主要产品盈利能力受损&#xff0c;不少医药医疗公司股价显著受压&#xff0c;投资者很是无奈。作为医疗系统一个子行业的疫苗&#xff0c;也大体如此。以康希诺为例&#xf…

WebRTC音视频通话-WebRTC推拉流过程中日志log输出

WebRTC音视频通话-WebRTC推拉流过程中日志log输出 之前实现iOS端调用ossrs服务实现推拉流流程。 推流&#xff1a;https://blog.csdn.net/gloryFlow/article/details/132262724 拉流&#xff1a;https://blog.csdn.net/gloryFlow/article/details/132417602 在推拉流过程中的…

Redis 主从复制和哨兵模式

一、概念 主从复制&#xff0c;是指将一台 Redis 服务器的数据&#xff0c;复制到其他的 Redis 服务器。前者称为主节点&#xff08;master/leader&#xff09;&#xff0c;后者称为从节点&#xff08;slave/follower&#xff09;。数据的复制是单向的&#xff0c;只能由主节点…

利用条件竞争突破优惠券仅能使用一次逻辑限制

Portswigger练兵场之条件竞争 目录 Portswigger练兵场之条件竞争&#x1f984;条件竞争-突破一次逻辑限制&#x1f680;实验前置必要知识点&#x1f3c6;实验要求⚡️渗透开始1. 站点分析2. 登录3.日志探查4.功能点探究5.完成实验 修复方案 &#x1f984;条件竞争-突破一次逻辑…

java八股文面试[多线程]——线程池拒绝策略

四种线程池拒绝策略&#xff08;handler&#xff09; 当线程池的线程数达到最大线程数时&#xff0c;需要执行拒绝策略。拒绝策略需要实现 RejectedExecutionHandler 接口&#xff0c;并实现 rejectedExecution(Runnable r, ThreadPoolExecutor executor) 方法。不过…

前端基础2——CSS样式

文章目录 一、使用方式1.1 内联方式1.2 内部方式1.3 外部导入方式&#xff08;推荐&#xff09; 二、选择器类型2.1 元素选择器2.2 ID选择器2.3 类选择器2.4 派生选择器 三、常用属性3.1 内边距和外边距3.2 文本3.3 边框3.4 背景3.5 定位3.6 浮动3.7 字体3.8 其他属性 四、案例…

信息技术02--初/高中--分类选择题(377道题与解析)

文章目录 第一章 办公软件 1-96第二章 信息技术基础 1-41第三章 计算机系统基础 1-28第四章 多媒体技术 1-115第五章 计算机网络技术 1-50第六章 信息安全 1-3第七章 算法与程序简介 1-13第八章 数据结构 1-2第九章 数据库技术 1-20第十章 练习 1-9 第一章 办公软件 1-96 1、某…

Cygwin是什么?是Windows还是Linux?

原文作者&#xff1a;gentle_zhou 原文链接&#xff1a;https://bbs.huaweicloud.com/blogs/408674 最近在和客户交流的时候&#xff0c;一直以为客户的研发环境就是windows 7&#xff0c;直到和对面的研发团队交流的时候&#xff0c;得到的反馈是在windows 7系统上安装了Cygw…

C语言深入理解指针(非常详细)(一)

目录 内存和地址内存编址的理解 指针变量和地址取地址操作符&#xff08;&&#xff09;指针变量和解引用操作符&#xff08;*&#xff09;指针变量如何拆解指针类型解引用操作符 指针变量的大小 指针变量类型的意义指针的解引用指针-整数 const修饰指针const修饰变量const修…

智慧园区封闭化管理之人车定位及轨迹追踪

园区封闭化管理在提高园区安全性、管理效率方面发挥着重要作用&#xff0c;人车定位及轨迹追踪是推动园区智慧封闭化管理的关键技术。本文将探讨人车定位及轨迹追踪技术在智慧园区封闭化管理中的应用&#xff0c;带您了解数字化时代园区管理的创新之路。 一、人车定位技术的突破…

Echarts遇到Vue3时遇到的问题

将vue2的Echarts代码迁移到了vue3项目上&#xff0c;引发的问题 问题描述&#xff1a; 1. 点击图例legend时刻度轴偏移&#xff0c;图像不展示&#xff0c;以及报错 初始chart正常.图 点击图例后的chart和报错.图 2. 调用resize()不生效且报错 初始正常.图 修改屏幕尺寸调用r…

[ Linux Audio 篇 ] Linux Audio 子系统资料集锦

Linux Audio 子系统资料 背景OSS VS ALSAALSA 驱动ALSA libALSA Plugin音频延迟音频调试音频书籍 背景 最近需要准备Linux Audio 相关的PPT&#xff0c;于是将以往的知识点和遇到的问题进行整理和梳理&#xff0c;以便向大家讲解。同时&#xff0c;还整理了在这个过程中发现的…

小技巧,将你的Python代码运行情况用动画实时呈现

咱们初学者练习编程时&#xff0c;常常难以理解简单循环&#xff0c;数据结构&#xff0c;迭代的操作原理。 现在不怕了&#xff0c;我们可以借助一个在线工具逐步执行代码&#xff0c;并直观查看其运行过程。 它是由 Philip Guo 开发的一个免费教育工具&#xff0c;帮助学生攻…

这5个理由告诉你为什么要采用微前端架构

微前端是一种前端开发的架构方法&#xff0c;已经变得越来越流行&#xff0c;这也预示着它很可能代表 Web 开发的未来。所以学习这种架构带来的好处对你的应用程序和开发团队是不言而喻的。 本文将分享我和我的团队使用这种方法两年来的经验所得&#xff0c;以及帮助你分析在你…