学习记录day18——数据结构 算法

算法的相关概念

        程序 = 数据结构 + 算法

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

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

算法的特性

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

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

3、输入:有零个或多个输入

4、输出:至少一个输出,可输出多个

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

算法的设计要求

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

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

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

4、高效率:要求设计复杂度尽可能低

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

时间复杂度

算法执行消耗时间的度量 

计算公式:T(n) = O(f(n));

        T(n):时间复杂度
        n:表示问题的规模
        f(n):是问题规模与执行次数之间的函数
        O(f(n)):使用O阶记法,记录算法时间复杂度

常见的数据复杂度

排序算法 

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

排序的分类

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

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

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

4、归并类:二路归并、多路归并

冒泡排序

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

2、冒泡排序原理

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

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

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

3、算法


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;               //标志位 置1int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}if (flag == 0)       //标志位为0 说明未进入if语句 即排列已完成 直接退出循环{break;}}printf("bubble_sort on\n");
}

选择排序

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

1、排序步骤:

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

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

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

2、算法

void select_sort(int *arr, int n)
{int min = 0;     //定义一个变量 存储最小值for (int i = 0; i < n; i++){min = i;    //记录下标for (int j = i + 1; j < n; j++){if (arr[min] > arr[j])  //更新最小值{min = j;}}if (min != i)          //如果最小值不是待排序序列第一个 则换置换{int temp = arr[min];arr[min] = arr[i];arr[i] = temp;}}printf("select_sort on\n");
}

直接插入排序

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

1、排序步骤

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

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

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

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

2、算法

        

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] = arr[i];                                 //后移结束 插入记录的元素数值                                 }printf("insert_sort on\n");
}

快速排序

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

        时间复杂度:O(nlog2n)    n倍以2为底2的对数

1、排序步骤

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

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

        3)再对各部分重新选择基准元素并依此规则排序 直到每个部分只剩一个元素为止

 2、算法

int part(int *arr,int low ,int high)
{int X = arr[0];        //将第一个元素定为基准while(low < high)      //循环条件{while (low < high && arr[low] >= X)   //避免错位   {high--;}arr[low] = arr[high];     //将小值前置while (low < high && arr[high] =< X){low++;}arr[high] = arr[low];     //将大值后置}//循环结束  此时 low == higharr[low] = X;   //将基准放入指定位置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);  //对较大端进行递归return ;
}

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

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

相关文章

35_YOLOX网络详解

1.1 简介 YOLOX是YOLO系列&#xff08;You Only Look Once&#xff09;目标检测模型的一个最新变种&#xff0c;由阿里云团队和旷视科技在2021年提出。YOLO系列以其快速、准确的目标检测能力而闻名&#xff0c;而YOLOX在此基础上进行了多方面的改进和优化&#xff0c;旨在提供…

机器学习数学基础(2)--最大似然函数

声明&#xff1a;本文章是根据网上资料&#xff0c;加上自己整理和理解而成&#xff0c;仅为记录自己学习的点点滴滴。可能有错误&#xff0c;欢迎大家指正。 在机器学习和统计学领域中&#xff0c;似然函数&#xff08;Likelihood Function&#xff09;是一个至关重要的概念。…

AIGC的神秘面纱——利用人工智能生成内容改变我们的生活

近年来&#xff0c;人工智能生成内容&#xff08;AIGC&#xff09;正在迅速改变我们与数字世界互动的方式。从自动写作到图像生成&#xff0c;AIGC正逐渐走进我们的日常生活。它不仅提高了效率&#xff0c;还为创意和商业活动带来了新的可能性。让我们一起来探索AIGC的世界&…

解读 IP 地址定位

你是否好奇众多平台推出的 IP 归属地功能是如何确定的位置&#xff1f;其实这些说起来并不难。接下来让我来给你们说一下其中的“奥秘”吧~ 一、IP 定位背后的原理 首先&#xff0c;从“IP 地址”开始。因为每个联网设备在接入网络时都会被分配一个独一无二的 IP 地址。根据这…

通信原理思科实验三:无线局域网实验

实验三 无线局域网实验 一&#xff1a;无线局域网基础服务集 实验步骤&#xff1a; 进入物理工作区&#xff0c;导航选择 城市家园; 选择设备 AP0&#xff0c;并分别选择Laptop0、Laptop1放在APO范围外区域 修改笔记本的网卡&#xff0c;从以太网卡切换到无线网卡WPC300N 切…

3.多租户调研1

https://gitee.com/xiaoqiangBUG/hello-ruoyi-cloud.git 1.mybatis plus 的插件 TenantLineInnerInterceptor 是 MyBatis Plus 框架中的一个拦截器&#xff0c;它用于实现多租户系统的数据隔离。在多租户应用中&#xff0c;不同的租户应该只能访问到自己的数据&#xff0c;而…

TCP网络socket编程(面向连接)

Tcp面向链接、面向字节流和文件的读写非常类似&#xff08;&#xff09;&#xff1a;客户端创建套接字主动建立连接&#xff0c;服务器监听套接字一直等待连接的到来&#xff0c;监听到一个&#xff0c;就创建一个新的套接字用于IO 服务器&#xff1a; 创建套接字&#xff1a…

【数据结构】单链表面试题(Java + 力扣 + 详解)

&#x1f387;&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳&#xff0c;欢迎大佬指点&#xff01; 人生格言: 当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友…

动态代理更改Java方法的返回参数(可用于优化feign调用后R对象的统一处理)

动态代理更改Java方法的返回参数&#xff08;可用于优化feign调用后R对象的统一处理&#xff09; 需求原始解决方案优化后方案1.首先创建AfterInterface.java2.创建InvocationHandler处理代理方法3. 调用 实际运行场景拓展 需求 某些场景&#xff0c;调用别人的方法&#xff0…

Chapter 15 Python函数进阶

欢迎大家订阅【Python从入门到精通】专栏&#xff0c;一起探索Python的无限可能&#xff01; 文章目录 前言一、函数多返回值二、函数的多种传参方式三、匿名函数 前言 在Python中&#xff0c;函数是组织代码、提高重用性与可读性的基本构建块。随着程序逻辑的复杂性增加&…

在 Windows 上安装 PostgreSQL

官网下载地址&#xff1a; https://www.enterprisedb.com/downloads/postgres-postgresql-downloadsWindows平台 官网直接提供exe安装包&#xff0c;没有手动安装的压缩包 postgresql-14.4-1-windows-x64.exe几个重要的安装选项 安装界面会指定服务程序和库两个路径&#xf…

压测实操--kafka-consumer压测方案

作者&#xff1a;九月 环境信息&#xff1a; 操作系统centos7.9&#xff0c;kafka版本为hdp集群中的2.0版本。 Consumer相关参数 使用Kafka自带的kafka-consumer-perf-test.sh脚本进行压测&#xff0c;该脚本参数为&#xff1a; thread&#xff1a;测试时的单机线程数&…

刷机维修进阶教程-----何谓“tee损坏” 指纹丢失 掉帧 传感器失效?详细修复步骤教程

TEE损坏指的是安卓机型中Key Attestation密钥认证所依赖的可信应用中的证书库被破坏了。然后拒绝为指纹密匙认证提供服务。加密的密匙由TEE负责管理。tee损坏只影响当前机型的密匙认证。不影响加密。通俗的理解。如果你机型维修或者刷机或者解锁或者格机 全檫除分区等等后有异常…

Elasticsearch集群配置-节点职责划分 Hot Warm 架构实践

前言 本文主要讲了ES在节点部署时可以考虑的节点职责划分&#xff0c;如果不考虑节点部署&#xff0c;那么所有节点都会身兼数职&#xff08;master-eligible &#xff0c;data&#xff0c;coordinate等&#xff09;&#xff0c;这对后期的维护拓展并不利&#xff0c;所以本文…

软件测试10 渗透性测试及验收测试

渗透性测试及验收测试 知识回顾 Web UI自动化测试 引入自动化测试需要满足的条件自动化测试流程简述自动化测试的关键技术Selenium页面元素定位方式 目标 了解安全测试的概念了解常见的安全漏洞了解安全测试流程及测试工具的使用理解验收测试的概念掌握Alpha测试和Beta测试…

【React 】开发环境搭建详细指南

文章目录 一、准备工作1. 安装 Node.js 和 npm2. 选择代码编辑器 二、创建 React 项目1. 使用 Create React App2. 手动配置 React 项目 三、集成开发工具1. ESLint 和 Prettier2. 使用 Git 进行版本控制 在现代前端开发中&#xff0c;React 是一个非常流行的框架&#xff0c;用…

【计算机毕业设计】866校企合作管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Git处理Failed to connect to www.google.com port 80: Timed out

Git处理Failed to connect to www.google.com port 80: Timed out 输入提交代码命令&#xff1a;git push -u origin master 报错&#xff1a;fatal: unable to access https://gitee.com/solitudeYu/gerenzhuye.git/: Failed to connect to www.google.com port 80: Timed ou…

AI数字人+城市交通大数据可视化平台,让交通管理与服务更简便、更智能

如今&#xff0c;AI数字人作为科技革命和产业革命的重要驱动力&#xff0c;AI数字人接入城市交通大数据可视化平台&#xff0c;可以有效地将各硬件与业务系统进行深度融合&#xff0c;完成业务闭环。依托AI数字人的应用&#xff0c;使城市交通大数据可视化平台的使用复杂度大幅…

我在Vscode学Java泛型(泛型设计、擦除、通配符)

Java泛型 一、泛型 Generics的意义1.1 在没有泛型的时候&#xff0c;集合如何存储数据1.2 引入泛型的好处1.3 注意事项1.3.1 泛型不支持基本数据类型1.3.2 当泛型指定类型&#xff0c;传递数据时可传入该类及其子类类型1.3.3 如果不写泛型&#xff0c;类型默认是Object 二、泛型…