算法整理:排序

快速排序

首先不妨以第一个数为基准数,在一轮遍历后,使基准数左边的数都小于基准数,基准数右边的数都大于基准数。

当然也可以取中间的数为基准数。

  void quick_sort(vector<int>&nums,int l,int r){if(l>=r)return;int idx=l;//基准数选最左面int i=l;int j=r;while(i<j){while(i<j&&nums[j]>=nums[idx])j--;//右面先走while(i<j&&nums[i]<=nums[idx])i++;if(i<j){int t=nums[i];nums[i]=nums[j];nums[j]=t;}}int t=nums[idx];nums[idx]=nums[i];nums[i]=t;quick_sort(nums,l,i-1);quick_sort(nums,i+1,r);}

i,j相遇时,枢轴通常会被放置在两个指针相遇的位置上。

【排序算法】快速排序(C语言)_c语言快速排序-CSDN博客

霍尔法。(需要理解为什么,右面的先走。)

归并排序

数组操作 

void merge_sort(int q[],int l,int r){if(l>=r)return;int mid=(l+r)/2;merge_sort(q,l,mid);merge_sort(q,mid+1,r);int k=0;int i=l;int j=mid+1;while(i<=mid&&j<=r){if(q[i]<=q[j])temp[k++]=q[i++];else temp[k++]=q[j++];}while(i<=mid) temp[k++]=q[i++];while(j<=r) temp[k++]=q[j++];for(k=0,i=l;i<=r;) q[i++]=temp[k++];
}

vector操作 

vector<int> mergeSort(vector<int>&nums,int l,int r){if(l==r)return {nums[l]};int mid=(l+r)/2;//递归排序左右区间vector<int>left = mergeSort(nums,l,mid);vector<int>right = mergeSort(nums,mid+1,r);//双指针合并两个有序区间vector<int>res; int n=left.size(); int m=right.size();int i=0;int j=0;while(i<n&&j<m){if(i<n&&j<m&&left[i]<right[j]){res.push_back(left[i++]);}else{res.push_back(right[j++]);}}while(i<n)res.push_back(left[i++]);while(j<m)res.push_back(right[j++]);return res;
}

选择排序 

void SelectSort(vector<int>&vec){int min_k;for(int i=0;i<vec.size();i++){min_k=i;for(int j=i;j<vec.size();j++){if(vec[j]<vec[min_k])swap(j,min_k);}swap(vec[min_k],vec[i]);}
}

基数排序

基数排序:
通过将待排序元素按照位数进行分组,逐位地进行排序,从最低位到最高位,最终得到有序的结果。
基数排序的工作原理如下:
首先,找到待排序元素中的最大值,确定它的位数。从最低位(个位)开始,按照该位的值将元素进行分组(0到9),形成桶。依次从最低位到最高位,对每个桶中的元素按照分组顺序重新排列。重复上述过程,直到按照所有位数完成排序,得到最终有序的结果。

第一轮

第二轮

堆排序

 堆是一个完全二叉树,使用顺序存储结构。

(1是根节点,i的左孩子结点的下标为2*i,右孩子结点的下标为2*i+1)。

大根堆:每个结点的值都比左子树和右子树所有结点的值大。

小根堆:每个结点的值都比左子树和右子树所有结点的值小。

排序思想
1.将待排序的数组构造成一个大根堆,此时,整个数组的最大值就是堆结构的顶端

2.将顶端的数与末尾的数交换,此时,末尾的数为最大值,剩余待排序数组个数为n-1(进行删除根节点操作)

3.将剩余的n-1个数再构造成大根堆(只需进行一次down操作),再将顶端数与n-1位置的数交换,如此反复执行,便能得到有序数组。

堆的基本操作:调整:up(x); down(x);

(1)插入一个数:heap[++size]=x;up(size);

把这个数放到完全二叉树的最后,然后对这个数进行up调整。

(2)求集合当中的最小值:heap[1];

(3)删除最小值:heap[1]=heap[size];size--;down(1);

用完全二叉树的最后一个数替换根节点,然后对根节点进行down调整。

(4)修改任意一个元素:heap[k]=x;down(k);up(k);

修改对应元素后,先进行down操作,再进行up操作。

down(x)操作(小根堆为例):(log(n))

比较x与其左右孩子结点的大小关系,如果比左右孩子大,就交换两个结点。

void down(int u){int t=u;if(u * 2<=size && h[u*2]<h[t]) t = u*2;if(u * 2<=size && h[u*2+1]<h[t]) t = u*2+1;// t表示u和左孩子和右孩子最小值的下标// 如果u不是最小的,就交换x和t,并且递归对tdown操作if(u!=t){swap(h[u],h[t]);down(t);}
}

C++中堆的应用:
#include <iostream>
#include <queue>
#include <vector>
using namespace std;// 创建一个小根堆
priority_queue<int, vector<int>, greater<int>>minHeap;// 创建一个大根堆
priority_queue<int>maxHeap;//加元素
minHeap.push(10);
maxHeap.push(8);//遍历堆
while (!minHeap.empty()) {cout<<minHeap.top()<<" ";minHeap.pop();
}//取堆顶元素minHeap.top();maxHeap.top();//删除并返回堆顶元素
minHeap.top();
minHeap.pop();

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

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

相关文章

硬件工程师职责与核心技能有哪些?

作为一个优秀的硬件工程师&#xff0c;必须要具备优秀的职业技能。那么&#xff0c;有些刚入行的工程师及在校的学生经常会问到&#xff1a;硬件工程师需要哪些核心技能&#xff1f;要回答这个问题&#xff0c;首先要明白硬件工程师的职责&#xff0c;然后才能知道核心技能要求…

神经网络学习笔记10——RNN、ELMo、Transformer、GPT、BERT

系列文章目录 参考博客1 参考博客2 文章目录 系列文章目录前言一、RNN1、简介2、模型结构3、RNN公式分析4、RNN的优缺点及优化1&#xff09;LSTM是RNN的优化结构2&#xff09;GRU是LSTM的简化结构 二、ELMo1、简介2、模型结构1&#xff09;输入2&#xff09;左右双向上下文信…

Gemini即将收费,GPT无需注册?GPT3.5白嫖和升级教程

&#x1f310;Gemini 即将开始收费 开发者“白嫖”的好日子到头了 - Gemini将开始收费&#xff0c;影响使用Google AI for Developers提供的Gemini API的用户。 - Gemini API将引入按量付费定价&#xff0c;需要注意新的服务条款。 - 用户需在5月2日之前停止使用Gemini API和Go…

使用Java拓展本地开源大模型的网络搜索问答能力

背景 开源大模型通常不具备最新语料的问答能力。因此需要外部插件的拓展&#xff0c;目前主流的langChain框架已经集成了网络搜索的能力。但是作为一个倔强的Java程序员&#xff0c;还是想要用Java去实现。 注册SerpAPI Serpapi 提供了多种搜索引擎的搜索API接口。 访问 Ser…

数据结构(二)----线性表(顺序表,链表)

目录 1.线性表的概念 2.线性表的基本操作 3.存储线性表的方式 &#xff08;1&#xff09;顺序表 •顺序表的概念 •顺序表的实现 静态分配&#xff1a; 动态分配&#xff1a; 顺序表的插入&#xff1a; 顺序表的删除&#xff1a; 顺序表的按位查找&#xff1a; 顺序…

自我认识的方法模型图

在漫长的人生旅途中&#xff0c;我们都在不断地探索、追寻&#xff0c;努力寻找那个最真实、最完整的自我。因为只有真正了解自己&#xff0c;才能战胜内心的种种困惑与恐惧&#xff0c;进而战胜外在的一切挑战与困难。自我认识&#xff0c;是每个人成长的必经之路&#xff0c;…

探索未来外贸电商系统的创新架构

在全球化、数字化的时代背景下&#xff0c;外贸电商行业呈现出蓬勃发展的态势。为了适应市场竞争的激烈和用户需求的多样化&#xff0c;外贸电商系统的架构设计显得尤为重要。本文将深入探讨未来外贸电商系统的创新架构&#xff0c;以期为行业发展提供新的思路和方向。 随着全…

使用Flutter创建带有图标提示的TextField

在移动应用开发中&#xff0c;TextField是一种常用的用户输入小部件。然而&#xff0c;有时向用户提供有关他们应该输入什么的提示或说明是很有帮助的。在本教程中&#xff0c;我们将创建一个Flutter应用程序&#xff0c;演示如何在TextField旁边包含一个图标提示。 编写代码 …

初次在 GitHub 建立仓库以及公开代码的流程 - 公开代码

初次在 GitHub 建立仓库以及公开代码的流程 - 公开代码 References 在已有仓库中添加代码并公开。 git clone 已有仓库 将已有仓库 clone 到本地的开发环境中。 strongforeverstrong:~$ mkdir github_work strongforeverstrong:~$ cd github_work/ strongforeverstrong:~/git…

【.NET全栈】.NET全栈学习路线

一、微软官方C#学习 https://learn.microsoft.com/zh-cn/dotnet/csharp/tour-of-csharp/ C#中的数据类型 二、2021 ASP.NET Core 开发者路线图 GitHub地址&#xff1a;https://github.com/MoienTajik/AspNetCore-Developer-Roadmap/blob/master/ReadMe.zh-Hans.md 三、路线…

把标注数据导入到知识图谱

文章目录 简介数据导入Doccano标注数据&#xff0c;导入到Neo4j寻求帮助 简介 团队成员使用 Doccano 标注了一些数据&#xff0c;包括 命名实体识别、关系和文本分类 的标注的数据&#xff1b; 工作步骤如下&#xff1a; 首先将标注数据导入到Doccano&#xff0c;查看一下标注…

Idea2023创建Servlet项目

① Java EE 只是一个抽象的规范&#xff0c;具体实现称为应用服务器。 ② Java EE 只需要两个包 jsp-api.jar 和 servlet-api.jar&#xff0c;而这两个包是没有官方版本的。也就是说&#xff0c;Java 没有提供这两个包&#xff0c;只提供了一个规范。那么这两个包是谁提供的…

逻辑回归(Logistic Regression)详解

逻辑回归&#xff08;Logistic Regression&#xff09;是一种常用的统计学习方法&#xff0c;用于解决二分类问题。虽然名字中包含“回归”&#xff0c;但逻辑回归实际上是一种分类算法&#xff0c;而不是回归算法。它的基本原理是使用逻辑函数&#xff08;也称为Sigmoid函数&a…

【TI毫米波雷达】IWR6843AOP的官方文件资源名称BUG,选择xwr68xx还是xwr64xx,及需要注意的问题

【TI毫米波雷达】IWR6843AOP的官方文件资源名称BUG&#xff0c;选择xwr68xx还是xwr64xx&#xff0c;及需要注意的问题 文章目录 demo工程out_of_box文件调试bin文件名称需要注意的问题附录&#xff1a;结构框架雷达基本原理叙述雷达天线排列位置芯片框架Demo工程功能CCS工程导…

大模型学习笔记八:手撕AutoGPT

文章目录 一、功能需求二、演示用例三、核心模块流程图四、代码分析1&#xff09;Agent类目录创建智能体对象2&#xff09;开始主流程3&#xff09;在prompt的main目录输入主prompt和最后prompt4&#xff09;增加实际的工具集tools&#xff08;也就是函数&#xff09;5&#xf…

【协议篇:Http与Https】

1. Http 1.1 Http的定义 超文本传输协议&#xff08;Hypertext Transfer Protocol&#xff0c;HTTP&#xff09;是用于分布式、协作式和超媒体信息系统的应用层协议。它是互联网上最广泛应用的数据通信协议之一&#xff0c;尤其对于万维网&#xff08;WWW&#xff09;服务而言…

docker容器技术篇:Docker API配置与常用操作

docker容器技术篇&#xff1a;Docker API配置与使用 一、API具体是什么&#xff1f; 百科解释应用程序接口&#xff08;API&#xff09;&#xff0c;又称为应用编程接口&#xff0c;就是软件系统不同组成部分衔接的约定&#xff0c;蒙了吧&#xff01;&#xff01;&#xff0…

C语言要点细细梳理(上)

1.类型转换 1.1 隐式类型转换 在两个不同类型数据进行运算时&#xff0c;会把低精度类型的数据转为与高精度类型一致的数据类型然后计算&#xff0c;然后再根据赋值的需要把计算结果转回去 1.2 强制类型转换 可以将某种类型的数据转换为想要的精度&#xff0c;一般int、dou…

Postman和Python Request测试多行Form-data

1、请求参数有多个&#xff0c;F12查看请求体如下&#xff1a; 查看源代码&#xff1a; ------WebKitFormBoundaryHknGXm9VkhRUXZYC Content-Disposition: form-data; name"custId"IICON004 ------WebKitFormBoundaryHknGXm9VkhRUXZYC Content-Disposition: form-da…

java数据结构与算法刷题-----LeetCode417. 太平洋大西洋水流问题

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 深度优先遍历 深度优先遍历 解题思路&#xff1a;时间复杂度O( …