11-C++算法01-枚举排序

news2024/11/13 10:33:19

算法

📖 C++算法

在编程中,算法是解决问题的一系列步骤或规则。在C++中,提供了丰富的算法库,可以方便地进行各种常见的算法操作。本篇学习笔记将介绍一些常见的排序算法,帮助你理解和应用这些算法。

🚀 枚举

🎯 什么是枚举

枚举(暴力)是一种常见的算法解题方法,也称为穷举法。它的核心思想是通过遍历所有可能的情况,逐一检查每个情况是否满足问题的要求,从而找到问题的解决方案。

在枚举算法中,通过遍历问题的所有可能解,一一进行验证,直到找到符合要求的解,或者遍历完所有可能的解。这种方法有时被称为"暴力枚举",因为它不借助其他高效算法,而是直接尝试所有可能的情况。

枚举的核心思想是穷举和验证。它通过枚举所有可能的解决方案,逐个验证它们是否满足问题的限制条件。这种方法的优势在于简单直观,适用于一些规模较小的问题,或者是对解决方案的完整性要求较高的情况。

然而,枚举算法的一个主要缺点是它的时间复杂度通常较高,特别是在问题规模较大的情况下。由于要遍历所有可能的情况,枚举算法可能需要消耗大量的时间和计算资源。因此,在实际应用中,我们需要根据问题的规模和要求来选择合适的算法,以提高效率和降低计算成本。

总而言之,枚举(暴力)是一种通过遍历所有可能情况,并逐一验证其有效性的算法方法。它的核心思想是穷举和验证,适用于一些规模较小或对解决方案完整性要求较高的问题。然而,由于其时间复杂度较高,需要在实际应用中谨慎选择使用。它通常适用于问题的解空间较小或问题规模较小的情况。

🎯 枚举案例

让我们以一个简单的例子来说明枚举算法的应用。假设我们要从1到100中找出能被3整除且能被5整除的数字,可以使用枚举算法来解决。

#include <iostream>
using namespace std;

int main() {
    for (int i = 1; i <= 100; i++) {
        if (i % 3 == 0 && i % 5 == 0) {
            cout << i << " ";
        }
    }

    return 0;
}

在上述示例中,我们使用循环遍历从1到100的数字,然后通过判断是否能被3整除且能被5整除,来找出满足条件的数字并输出。

🔍 排序

排序是一种常见的算法操作,用于将一组数据按照特定的顺序进行排列。在实际开发中,常见的排序算法有冒泡排序、选择排序、插入排序、桶排序等。让我们逐一介绍这些排序算法及其练习题。

✨ 冒泡排序

冒泡排序是一种简单直观的排序算法,它重复地遍历待排序序列,每次比较相邻的两个元素,如果顺序错误就交换位置,直到整个序列有序为止。

#include <iostream>
using namespace std;

void bubbleSort(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                // 交换位置
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

int main() {
    int arr[] = {5, 2, 8, 1, 9};
    int n = sizeof(arr) / sizeof(arr[0]);

    bubbleSort(arr, n);

    cout << "Sorted array: ";
    for (int i = 0; i <

 n; i++) {
        cout << arr[i] << " ";
    }

    return 0;
}

在上述示例中,我们使用冒泡排序算法对数组进行排序,并输出排序后的结果。

冒泡排序练习题

练习题:请编写一个程序,使用冒泡排序算法对用户输入的一组整数进行排序。

#include <iostream>
using namespace std;

void bubbleSort(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                // 交换位置
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

int main() {
    int n;
    cout << "Enter the number of elements: ";
    cin >> n;

    int arr[n];
    cout << "Enter the elements: ";
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }

    bubbleSort(arr, n);

    cout << "Sorted array: ";
    for (int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }

    return 0;
}

在上述练习题中,我们首先让用户输入一组整数,然后使用冒泡排序算法对其进行排序,并输出排序后的结果。

✨ 选择排序

选择排序是一种简单直观的排序算法,它将待排序序列分为已排序和未排序两部分,每次从未排序部分选择最小的元素,放到已排序部分的末尾。

#include <iostream>
using namespace std;

void selectionSort(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
        int minIndex = i;
        for (int j = i + 1; j < n; j++) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }
        // 交换位置
        int temp = arr[i];
        arr[i] = arr[minIndex];
        arr[minIndex] = temp;
    }
}

int main() {
    int arr[] = {5, 2, 8, 1, 9};
    int n = sizeof(arr) / sizeof(arr[0]);

    selectionSort(arr, n);

    cout << "Sorted array: ";
    for (int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }

    return 0;
}

在上述示例中,我们使用选择排序算法对数组进行排序,并输出排序后的结果。

选择排序练习题

练习题:请编写一个程序,使用选择排序算法对用户输入的一组整数进行排序。

#include <iostream>
using namespace std;

void selectionSort(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
        int minIndex = i;
        for (int j

 = i + 1; j < n; j++) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }
        // 交换位置
        int temp = arr[i];
        arr[i] = arr[minIndex];
        arr[minIndex] = temp;
    }
}

int main() {
    int n;
    cout << "Enter the number of elements: ";
    cin >> n;

    int arr[n];
    cout << "Enter the elements: ";
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }

    selectionSort(arr, n);

    cout << "Sorted array: ";
    for (int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }

    return 0;
}

在上述练习题中,我们首先让用户输入一组整数,然后使用选择排序算法对其进行排序,并输出排序后的结果。

✨ 插入排序

插入排序是一种简单直观的排序算法,它将待排序序列分为已排序和未排序两部分,每次从未排序部分选择一个元素,插入到已排序部分的合适位置。

#include <iostream>
using namespace std;

void insertionSort(int arr[], int n) {
    for (int i = 1; i < n; i++) {
        int key = arr[i];
        int j = i - 1;
        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = key;
    }
}

int main() {
    int arr[] = {5, 2, 8, 1, 9};
    int n = sizeof(arr) / sizeof(arr[0]);

    insertionSort(arr, n);

    cout << "Sorted array: ";
    for (int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }

    return 0;
}

在上述示例中,我们使用插入排序算法对数组进行排序,并输出排序后的结果。

插入排序练习题

练习题:请编写一个程序,使用插入排序算法对用户输入的一组整数进行排序。

#include <iostream>
using namespace std;

void insertionSort(int arr[], int n) {
    for (int i = 1; i < n; i++) {
        int key = arr[i];
        int j = i - 1;
        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = key;
    }
}

int main() {
    int n;
    cout << "Enter the number of elements: ";
    cin >> n;

    int arr[n];
    cout << "Enter the elements: ";
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }

    insertionSort(arr, n);

    cout << "Sorted array: ";
    for (int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }

    return 0;
}

在上述练习题中,我们首先让用户输入一组整数,然后使用插入排序算法对其进行排序,并输出排序后的结果。

✨ 桶排序

桶排序是一种分配排序算法,它通过将元素分配到不同的桶中,然后对每个桶中的元素进行排序,最后将所有桶中的元素合并得到有序序列。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

void bucketSort(float arr[], int n) {
    vector<float> buckets[n];
    for (int i = 0; i < n; i++) {
        int bucketIndex = n * arr[i];
        buckets[bucketIndex].push_back(arr[i]);
    }
    for (int i = 0; i < n; i++) {
        sort(buckets[i].begin(), buckets[i].end());
    }
    int index = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < buckets[i].size(); j++) {
            arr[index++] = buckets[i][j];
        }
    }
}

int main() {
    float arr[] = {0.12, 0.83, 0.45, 0.21, 0.67};
    int n = sizeof(arr) / sizeof(arr[0]);

    bucketSort(arr, n);

    cout << "Sorted array: ";
    for (int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }

    return 0;
}

在上述示例中,我们使用桶排序算法对浮点数数组进行排序,并输出排序后的结果。

桶排序练习题

练习题:请编写一个程序,使用桶排序算法对用户输入的一组浮点数进行排序。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

void bucketSort(float arr[], int n) {
    vector<float> buckets[n];
    for (int i = 0; i < n; i++) {
        int bucketIndex = n * arr[i];
        buckets[bucketIndex].push_back(arr[i]);
    }
    for (int i = 0; i < n; i++) {
        sort(buckets[i].begin(), buckets[i].end());
    }
    int index = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < buckets[i].size(); j++) {
            arr[index++] = buckets[i][j];
        }
    }
}

int main() {
    int n;
    cout << "Enter the number of elements: ";
    cin >> n;

    float arr[n];
    cout << "Enter the elements: ";
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }

    bucketSort(arr, n);

    cout << "Sorted array: ";
    for (int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }

    return 0;
}

在上述练习题中,我们首先让用户输入一组浮点数,然后使用桶排序算法对其进行排序,并输出排序后的结果。

📖总结

在本节中,我们介绍了枚举算法和常见的排序算法,包括冒泡排序、选择排序、插入排序和桶排序。这些算法是基础的排序算法,掌握它们对于理解和学习更高级的排序算法是非常重要的。

枚举算法是一种穷举所有可能的方法,通过遍历所有可能的解空间来解决问题。冒泡排序是一种简单直观的排序算法,通过相邻元素的比较和交换来将最大的元素逐步交换到数组的末尾。选择排序是一种每次选择最小元素的排序算法,通过不断选择未排序部分的最小元素并放到已排序部分的末尾来完成排序。插入排序是一种通过构建有序部分并逐步将元素插入到合适位置的排序算法。桶排序是一种将元素分配到不同桶中并对每个桶中的元素进行排序的算法,最后将所有桶中的元素合并得到有序序列。

通过对每种排序算法的原理、示例代码和练习题的学习和实践,我们可以更好地理解和掌握这些算法。排序算法在实际开发中有广泛的应用,对于处理数据和优化算法性能非常重要。掌握不同的排序算法有助于我们在不同场景下选择合适的算法,并能够对算法进行分析和优化。

希望本节的学习能够帮助你更好地理解和掌握C++中的枚举算法和排序算法。继续加油,继续学习,提升编程技能!🚀

⭐️希望本篇文章对你有所帮助。

⭐️如果你有任何问题或疑惑,请随时向提问。

⭐️感谢阅读!

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

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

相关文章

C语言VS Code 开发环境搭建

文章目录 官方文档安装拓展生成c_cpp_properties.json生成tasks.json生成launch.json测试Debug如何让程序debug完不退出&#xff1f;Windows版本的配置GDB和LLDB的区别 由于之前使用VS Code较少&#xff0c;缺少在VS Code上开发C程序的经验。本篇博文主要记录使用VS Code开发C程…

基于Tars高并发IM系统的设计与实现-基础篇2

基于Tars高并发IM系统的设计与实现-基础篇2 三大指标 高可用 分为服务高可用与存储高可用。 服务高可用 服务高可用要做到高可用必须具备两个特点&#xff1a; 负载均衡可横行扩展 当服务的请求量比较高的时候&#xff0c;一台服务不能满足需求&#xff0c;这时候需要多…

sklearn.preprocessing模块介绍

数据预处理 Binarizer: 二值化 用于将数值特征二值化。它将特征值与给定的阈值进行比较&#xff0c;并将特征值转换为布尔值&#xff08;0 或 1&#xff09;&#xff0c;取决于特征值是否超过阈值 Binarizer(*, threshold0.0, copyTrue)参数&#xff1a; threshold&#xf…

AGI—从GPT和大型语言模型中汲取的经验教训

点击蓝字 关注我们 关注并星标 从此不迷路 计算机视觉研究院 公众号ID&#xff5c;计算机视觉研究院 学习群&#xff5c;扫码在主页获取加入方式 论文地址&#xff1a;https://arxiv.org/pdf/2306.08641.pdf 计算机视觉研究院专栏 Column of Computer Vision Institute 人工智能…

【计算机视觉 | 图像分类】arxiv 计算机视觉关于图像分类的学术速递(6月 29 日论文合集)

文章目录 一、分类|识别相关(12篇)1.1 Pseudo-Bag Mixup Augmentation for Multiple Instance Learning Based Whole Slide Image Classification1.2 Improving Primate Sounds Classification using Binary Presorting for Deep Learning1.3 Challenges of Zero-Shot Recognit…

万物分割SAM家族 越发壮大!HQ-SAM、FastSAM 和 FasterSAM(MobileSAM)

卧剿&#xff0c;6万字&#xff01;30个方向130篇&#xff01;CVPR 2023 最全 AIGC 论文&#xff01;一口气读完。 1、&#xff08;更高质量&#xff09;Segment Anything in High Quality 最近的 Segment Anything Model (SAM) 代表了分割模型的一大飞跃&#xff0c;有强大的零…

从零实现深度学习框架——Seq2Seq机器翻译实战

引言 本着“凡我不能创造的&#xff0c;我就不能理解”的思想&#xff0c;本系列文章会基于纯Python以及NumPy从零创建自己的深度学习框架&#xff0c;该框架类似PyTorch能实现自动求导。 &#x1f4a1;系列文章完整目录&#xff1a; &#x1f449;点此&#x1f448; 要深入理解…

【你哥电力电子】 THE BUCK-BOOST 升降压斩波电路2

BUCK-BOOST电路2 2023年1月30日 nige in Tongji University #elecEngeneer 上链 文章目录 BUCK-BOOST电路26. CCM非理想能量守恒平均分析6.1 CCM非理想大信号平均模型6.2 CCM等效大信号平均模型6.3 CCM的DC电路模型6.4 CCM的小信号线性电路模型6.5 CCM非理想小信号传递函数6.…

【SaaS】多租户系统设计

文章目录 多租户系统设计一、SaaS 的系统分级二、应用程序必须支持多租户三、数据隔离方案3.1、独立应用独立库3.2、同一个应用程序&#xff0c;每个租户一个库3.3、同一个应用程序&#xff0c;同一个数据库3.4、分片多租户 四、我们的模型选择4.1、开发实践4.2、元数据/配置驱…

vue路由传参+案例(使用mock模拟后端数据)

路由传参 跳转路由时&#xff0c;可以给路由对应的组件内传参 声明式导航 /path?参数名值 /path/值 —需要路由对象提前配置 path: ‘/path/:参数名’ 对应的页面组件接收传递过来的值 $route.query.参数名 $route.params.参数名 router/index.js import Vue from vue // 1. …

解析matlab的audioread()输入输出参数

目录 一、API简介 二、实验 1. matlab 2. C语言 一、API简介 链接如下&#xff1a; 读取音频文件 - MATLAB audioread- MathWorks 中国 也可以浏览最新的英文版API说明&#xff1a; 简单说明如下&#xff1a; 1. 读取wav格式的文件&#xff0c;会自动跳过44个字节的文件…

初识React/JSX/组件/state/受控组件

JSX 推荐使用小括号包裹jsx 使用函数创建组件 使用类创建组件 抽离组件 事件绑定 事件对象 有状态和无状态组件/state 抽离事件处理程序 表单元素 受控组件 多表单优化 非受控组件(了解即可)

vhost-net-原理-初始化流程-数据传输流程-vhost-net后端

文章目录 1.vhost net2.vhost-net的初始化流程vhost net设置vhost dev设置vhost vring设置 3.数据收发流程分析3.1 数据发送3.2 数据接收 4ioventfd和irqfd的通知机制4.1ioeventfdqemu侧kvm侧总体效果 4.2irqfdqemu侧kvm侧总体效果 参考&#xff1a; 1.vhost net 传统的virtio…

ChatGPT Plugins内幕、源码及案例实战(一)

ChatGPT Plugins内幕、源码及案例实战 6.1 ChatGPT Plugins的工作原理 本节主要跟大家谈ChatGPT的插件(Plugins),这个内容非常重要。现在很多企业级的开发,一般都会基于ChatGPT 插件进行一些服务的封装,相当于开发了一个代理(Agent),把一些服务或者API封装在里面,然后…

eclipse编辑器汉化;eclipse安装中文插件

eclipse IDE默认是英文环境&#xff0c;使用起来略微不便&#xff0c;汉化还是很有必要的&#xff1b;下面记录一下安装中文插件的过程: 文章目录 一、 选择安装包地址二、 在eclipse安装中文插件2.1 在线安装2.2 手动下载安装包2.3 导入到eclipse 三、汉化插件介绍 一、 选择安…

实例005 可以拉伸的菜单界面

实例说明 如果管理程序功能菜单非常多&#xff0c;而用户只使用一些常用菜单&#xff0c;这时&#xff0c;可以将主菜单项下的不常用菜单隐藏起来。此种显示方式类似于对菜单进行拉伸。使用时&#xff0c;只需单击展开菜单&#xff0c;即可显示相应菜单功能。运行本例&#xf…

python matplotlib中colorbar的位置设置

colorbar单独设置一个轴对象&#xff0c;再对轴对象进行灵活设置 import numpy as np import matplotlib.pyplot as plt# 创建一个二维随机数组 data np.random.rand(10, 10)# 创建一个图形和一个子图 fig, ax plt.subplots()# 绘制热力图 heatmap ax.imshow(data, cmaphot…

在linux中快速安装Redis数据库

Redis中文网 点击该链接下载最5.0.4版本的Redis的压缩包 使用Xftp工具将Redis安装包上传到linux中 1.将压缩包解压到/opt目录下: tar -zxvf redis-5.0.4.tar.gz 2. 更新yun: sudo yum makecache fast 3.安装gcc: yum -y install gcc 4.安装完成通过输入 : gcc -v …

tiny tool - get_file_path_name_by_drop_file

文章目录 tiny tool - get_file_path_name_by_drop_file概述工程效果收获的知识点vs2022工程, 必须自己设置对话框可以接受文件的风格vs2022建立的工程, 默认是unicode编码, 设置剪贴板数据时, 必须要设置为unicode的格式, 否则剪切板中只有第一个字符工程主要实现END tiny too…

短信压力测试系统,支持自定义接口

短信压力测试系统,支持自定义接口 支持卡密充值&#xff0c;短信压力测试系统&#xff0c;解决一切骚扰电话&#xff0c;教程在压缩包里面 可多个服务器挂脚本分担压力&#xff0c;套了cdn导致无法正常执行脚本可以尝试添加白名单 这边建议使用MySQL方式 同服务器下直接配置…