day20算法

news2024/9/24 6:31:36

一、算法的相关概念

程序 = 数据结构 + 算法

算法是程序设计的灵魂,结构是程序设计的肉体

算法:计算机解决问题的方法或步骤

1.1 算法的特性

1> 确定性:算法中每一条语句都有确定的含义,不能模棱两可

2> 有穷性:程序执行一段时间后会自动结束

3> 输入:至少有零个或多个输入

4> 输出:至少一个或多个输出

5> 可行性:经济可行性、社会可行性、能够运行

1.2 算法的设计要求

1> 正确性:给定合理的输入数据,能够得到正确的结果

2> 健壮性:对于给定的不合理的输入数据,能够给出相应的处理措施

3> 可读性:程序核心代码写注释、程序代码有缩进、程序代码命名规范

4> 高效率:要求时间复杂度要尽可能低

5> 低存储:要求空间复杂度尽可能低

1.3 时间复杂度

1> 算法时间复杂度计算公式:T(n) = O(f(n));

T(n):时间复杂度

n:表示问题的规模

f(n) :是问题规模与执行次数之间的函数

O(f(n)):使用O阶记法,记录算法时间复杂度

2> 时间复杂度推导

3> 常见的时间复杂度

二、排序算法

根据数据元素的关键字,安照升序或降序的方式将数据元素重新排列的过程称为排序

2.1 排序的分类

1> 交换类排序:冒泡排序、快速排序

2> 选择类排序:简单选择排序、堆排序

3> 插入类排序:直接插入排序、折半插入排序

4> 归并排序:二路归并、多路归并

2.2 冒泡排序(O(N^2))

1> 在排序过程中,越大(小)的数据,经由交换后,会慢慢的“浮”到顶端,如同气泡一样

2> 冒泡排序原理

比较相邻元素,如果第一个比第二个大(小)则交换

经过一趟排序后会使最大(最小)的元素落到最后 重复上面的步骤,直到没有任何一对数字需要比较为止

当某一趟的排序过程中,出现没有数据交换的过程,则结束整个排序

//定义冒泡排序函数
void bubble_sort(int *arr, int n)
{
    for(int i=1; i<n; i++)  //趟数
    {
        int flag = 0;       //判断是否在排序中改变

        for(int j=0; j<n-i; j++)
        {
            if(arr[j] > arr[j+1])
            {
                flag = 1;     //设置标志
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
        
        //说明上一堂的排序中,没有进行数据的交换
        if(flag == 0)
        {
            break;
        }
    }

    printf("排序成功\n");
}

2.3 选择排序

1> 概念:每次从待排序序列中,找到最大(小)值,将其与待排序序列的第一个进行交换

2> 原理

1、从待排序序列中选择最值

2、如果最值不是待排序序列的第一个,则进行交换

3、从剩余待排序序列中,继续重复前两次的操作,直到,待排序序列为空

3> 算法

//定义选择排序
void select_sort(int *arr, int n)
{
    int mini = 0;
    for(int i=0; i<n; i++)    //遍历已排序序列
    {
        mini = i;       //将待排序的第一个元素当做最值
        for(int j=i+1; j<n; j++)   //遍历待排序序列
        {
            if(arr[mini] > arr[j])
            {
                mini = j;     //更新最小值下标
            }
        }

        //判断最小值是否是第一个元素
        if(mini != i)
        {
            //将最小值与待排序序列第一个交换
            int temp = arr[mini];
            arr[mini] = arr[i];
            arr[i] = temp;
        }
    }

    printf("排序结果\n");
}

2.4 直接插入排序

1> 每次从待排序序列中,选择第一个,将其插入到已排序序列中

2> 原理

1、选取待排序序列中的第一个元素

2、跟前面的元素依次比较,如果前面的比当前元素大(小),则将前面的元素后移一位

3、直到出现前面的不比当前的大(小)或者已经到最前面了,将选取的元素,放入空位置上

4、对于待排序序列中的所有元素,重复上述操作

3> 代码

//定义插入排序函数
void insert_sort(int *arr, int n)
{
    int i,j;

    for(i=1; i<n; i++)    //不断从待排序序列中选元素
    {
        int temp = arr[i];   //将待排序序列的第一个备份
        for(j=i-1; temp<=arr[j]&&j>=0; j--)
        {
            //将元素后移
            arr[j+1] = arr[j];
        }

        arr[j+1] = temp;    //将元素放入对应位置
    }
    printf("排序成功\n");
}

2.5 快速排序(O(n*log2n))

1> 概念:快速排序是在序列元素与选定基准元素比较分割为大小两部分的交换排序

2> 原理

从待排序列中任取一个基准元素

与基准元素比较将待排序列分割为大小两部分

再对各部分重新选择基准元素并依此规则排序

直到每个部分只剩一个元素为止

3> 算法

//定义一趟快速排序函数
//返回值:基准最终的下标
//arr:数组起始地址
//low:要排序容器的最小下标
//high:要排序容器的最大下标
int part(int *arr, int low, int high)
{
    //选中基准
    int X = arr[low];        //把第一个元素当做基准
    while(high > low)            //让循环继续的条件
    {
        //判断high所在的元素是否都比基准大
        while(arr[high] >= X && high>low)   //为了不错位
        {
            high--;
        }
        arr[low] = arr[high];     //将小的值,向前放

        //判断low所在的元素是否都比基准小
        while(arr[low] <= X && high>low)
        {
            low++;
        }
        arr[high] = arr[low];     //将大的值,向后放
    }
    //基准的位置就选出来了 此时 high==low
    arr[low] = X;            //将基准放入指定位置
    printf("排序一趟\n");
    
    return low;          //返回基准的下标
}

//定义快速排序函数
void quick_sort(int *arr, int low, int high)
{
    if(low>=high)
    {
        return;        //只有一个元素,无需排序。递归出口
    }

    //不只一个元素时
    int mid = part(arr, low, high);    //进行一趟排序
    //对左半部分快排
    quick_sort(arr, low, mid-1);

    //对右半部分快排
    quick_sort(arr, mid+1, high);
}

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

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

相关文章

ModuleNotFoundError: No module named ‘scrapy.utils.reqser‘

在scrapy中使用scrapy-rabbitmq-scheduler会出现报错 ModuleNotFoundError: No module named scrapy.utils.reqser原因是新的版本的scrapy已经摒弃了该方法,但是scrapy-rabbitmq-scheduler 没有及时的更新,所以此时有两种解决方法 方法一.将scrapy回退至旧版本,找到对应的旧版…

提取集合中元素的某个属性组成String类型的集合,并且属性的值要非null,最后拼接该String类型的集合得到字符串

一、String类型的集合拼接得到字符串 方法一&#xff1a; 使用的是Java 8或更高版本&#xff0c;可以使用String.join()方法&#xff0c;这个方法可以非常方便地将一个集合中的元素拼接成一个字符串&#xff0c;并允许你指定分隔符。 import java.util.ArrayList; import j…

认识神经网络【多层感知器数学原理】

文章目录 1、什么是神经网络2、人工神经网络3、多层感知器3.1、输入层3.2、隐藏层3.2.1、隐藏层 13.2.2、隐藏层 2 3.3、输出层3.4、前向传播3.4.1、加权和⭐3.4.2、激活函数 3.5、反向传播3.5.1、计算梯度3.5.2、更新权重和偏置 4、小结 &#x1f343;作者介绍&#xff1a;双非…

微信小程序实现聊天界面,发送功能

.wxml <scroll-view scroll-y"true" style"height: {{windowHeight}}px;"><view wx:for"{{chatList}}" wx:for-index"index" wx:for-item"item" style"padding-top:{{index0?30:0}}rpx"><!-- 左…

Qt基础 | QSqlTableModel 的使用

文章目录 一、QSqlTableModel 的使用1.主窗口MainWindow类定义2.构造函数3.打开数据表3.1 添加 SQLite 数据库驱动、设置数据库名称、打开数据库3.2 数据模型设置、选择模型、自定义代理组件、界面组件与模型数据字段间的数据映射 4.添加、插入与删除记录5.保存与取消修改6.设置…

TikTok Shop全托管上线JIT,并预计10月开放西班牙和爱尔兰站点

据悉&#xff0c;TikTok Shop官方近期在其全托管平台上正式推出了JIT&#xff08;Just-In-Time&#xff09;生产模式&#xff0c;这一创新举措彻底颠覆了传统供应链流程&#xff0c;实现了“先有订单&#xff0c;再精准供货”的高效运营模式。对于广大卖家而言&#xff0c;这无…

网络安全基础知识及安全意识培训(73页可编辑PPT)

引言&#xff1a;在当今数字化时代&#xff0c;网络安全已成为企业和个人不可忽视的重要议题。随着互联网的普及和技术的飞速发展&#xff0c;网络威胁日益复杂多变&#xff0c;从简单的病毒传播到高级持续性威胁&#xff08;APT&#xff09;、勒索软件攻击、数据泄露等&#x…

汇川技术|中型PLC网络组态、CPU配置、使用技巧

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 今天学习InoProShop网络组态架构&#xff0c;熟悉Modbus和ModbusTCP网络编辑器的使用&#xff0c;并了解网络组态和相关功能使用技巧。 以下为学习笔记。 01 网络组态 1.1、支持总线 从总线视图上可以看出&#xff0c…

4、Python+MySQL+Flask的文件管理系统【附源码,运行简单】

4、PythonMySQLFlask的文件管理系统【附源码&#xff0c;运行简单】 总览 1、《文件管理系统》1.1 方案设计说明书设计目标工具列表 2、详细设计2.1 登录2.2 注册2.3 个人中心界面2.4 文件上传界面2.5 其他功能贴图 3、下载 总览 自己做的项目&#xff0c;禁止转载&#xff0c…

Android --- ContentProvider 内容提供者

理论知识 ContentProvider 是 Android中用于数据共享的机制&#xff0c;主要是用于进程间(App之间)。 如何进行数据共享&#xff1f; 内容提供者 ContentProvider 提供数据&#xff0c;需要继承这个类,&#xff0c;并重写其中的增删改查方法。 继承 ContentProvider 类并重写增…

麦歌恩MT6521-第三代汽车磁性角度传感器芯片

磁性编码芯片 -在线编程角度位置IC 描述&#xff1a; MT6521是麦歌恩微电子推出的新一代基于水平霍尔及聚磁片(IMC)技术原理的磁性角度和位置检测传感器芯片。该芯片内部包含了两对互成90放置的水平霍尔阵列及聚磁片&#xff0c;能够根据不同的型号配置来实现对XY&#xff0…

FPGA开发——偶数分频器的设计

一、概述 1、我们在日常进行FPGA的开发之中&#xff0c;会根据需求的不同设计不同的功能实现&#xff0c;这就需要不同的分频信号&#xff0c;而分频的思想在我们的日常开发中显得尤为重要。用通俗易懂的说法表示分频就是对计数器进行一个进一步设计从而达到不同的分频器的思想…

探索PyMuPDF:Python中的强大PDF处理库

探索PyMuPDF&#xff1a;Python中的强大PDF处理库 背景&#xff1a;为何选择PyMuPDF 在数字化时代&#xff0c;PDF文件因其跨平台的兼容性和对格式的严格保持而成为文档交换的通用格式。然而&#xff0c;处理PDF文件往往需要专门的工具或库。这就是PyMuPDF库的用武之地。PyMuP…

【JAVA开发笔记】Reids下载、安装、配置-Windows篇(超详细,含Redis可视化管理工具!!!)

目录 1. Redis 简介 2. 下载 Redis 安装包 3. 开启 Redis 服务 4. 配置环境变量 5. Redis 服务注册为系统服务 6. Redis 服务测试和简单使用 7. 下载安装 Redis 管理工具 8. 管理工具连接 Redis 服务器 1. Redis 简介 Redis&#xff08;Remote Dictionary Server&…

【elementui】记录el-table设置左、右列固定时,加大滚动条宽度至使滚动条部分被固定列遮挡的解决方法

当前elementui版本&#xff1a;2.8.2 现象&#xff1a;此处el-table__body-wrapper默认的滚动条宽度为8px&#xff0c;我加大到10px&#xff0c;如果不设置fixed一切正常&#xff0c;设置fixed后会被遮挡一点 el-table__fixed-right::before, .el-table__fixed::before 设置…

【BUG】已解决:SyntaxError:positional argument follows keyword argument

SyntaxError:positional argument follows keyword argument 目录 SyntaxError:positional argument follows keyword argument 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c…

前端性能优化:浏览器的2种缓存方式要弄清

在前端性能优化中&#xff0c;最重要的就是缓存&#xff0c;使用缓存可以极大的提升浏览器的响应速率。 什么是缓存呢&#xff1f; 当我们第一次访问某个网站时&#xff0c;浏览器会把网站中的图片等资源存储在电脑中&#xff0c;以备后续使用&#xff0c;第二次访问该网站时…

构建智能运维系统:创新架构与效率优化

随着信息技术的迅猛发展&#xff0c;企业对于运维效率和服务质量的要求越来越高。智能运维系统的设计和实施&#xff0c;不仅能够提升系统可靠性和响应速度&#xff0c;还能有效降低成本和人力投入。本文将深入探讨智能运维系统的架构设计原则和关键技术&#xff0c;为企业在运…

观成科技:活跃窃密木马TriStealer加密通信分析

1.概述 观成安全研究团队近期在现网监测到多起TriStealer窃密木马攻击事件&#xff0c;TriStealer窃密木马从2024年4月开始活跃&#xff0c;通过Bunny CDN进行载荷下发。TriStealer会收集系统信息、屏幕截图、浏览器中存储的账号密码以及设备中所有的“txt”后缀文件、桌面文件…

华清数据结构day7 24-7-24

1> 二叉树的创建、遍历自己实现一遍 bitree.h #ifndef BITREE_H #define BITREE_H #include<myhead.h> typedef char datatype;typedef struct Node {datatype data;struct Node *L;struct Node *R; }Node,*Bitree; //创建 Bitree tree_create(); //先序遍历 void p…