基础算法(一)

目录

一.排序

快速排序:

归并排序:

二.二分法

整数二分模板:

浮点二分:


 

一.排序

快速排序:

  • 从数列中挑出一个元素,称为 "基准"
  • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区操作。
  • 递归把小于基准值元素的子数列和大于基准值元素的子数列排序。b82c44d46c39475c912134a9b9ab43c0.gif
    static void quick_sort(int[] arr,int l,int r){if (l>=r) return;//特判小于等于1个的数组int x=arr[(l+r)>>1],i=l-1,j=r+1;//取分隔基准while (i<j){//把小于x的数放左边,大于x的数放右边//跳过已符合条件do i++; while (arr[i]<x);do j--; while (arr[j]>x);//交换使符合条件if (i<j){int t=arr[i];arr[i]=arr[j];arr[j]=t;}}//递归左右边排序quick_sort(arr,l,j);quick_sort(arr,j+1,r);}

归并排序:

利用归并(先递归排序子元素,再合并)的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题(divide)成一些小的问题然后递归求解,而(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

5fd175ece4ab4069b3786b8647001d27.gif

 

    static void merge_sort(int[] arr, int l, int r) {if (l >= r) return;int mid = l + r >> 1;merge_sort(arr, l, mid);//递归排序左merge_sort(arr, mid + 1, r);//右//合并int[] tmp = new int[arr.length];int k = 0, i = l, j = mid + 1;while (i <= mid && j <= r) {//从排序好的左右数组取最小依次放入tmp数组,知道某一个数组取完if (arr[i] < arr[j])tmp[k++] = arr[i++];elsetmp[k++] = arr[j++];}//剩余部分直接放入tmp数组末尾while (i <= mid) tmp[k++] = arr[i++];while (j <= r) tmp[k++] = arr[j++];//tmp数组赋给原数组for (i = l, j = 0; i <= r; i++, j++) arr[i] = tmp[j];}

二.二分法

二分法的思想很简单,因为整个数组是单调的,每次判断后可将另外一半直接排除,大大提高查找效率,但是二分查找的边界问题很容易成为问题

整数二分模板:

    static int binary_search1(int[] arr,int l, int r){while (l<r){int mid=l+r>>1;if (check(mid)){r=mid;}else {l=mid+1;}}return l;}static int binary_search2(int[] arr,int l,int r){while (l<r){int mid=l+r+1>>1;if(check(mid)){l=mid;}else {r=mid-1;}}return l;}

根据具体情况选择判断后边界的取值,特别注意不同边界下mid的初始化.

浮点二分:

    static double binary_search3(double[] arr,double l,double r){final double eps=1e-6;while (r-l>eps){double mid=(l+r)/2;if (check(mid)) r=mid;else l=mid;}return l;}

浮点二分的核心在使用eps的精度进行判断

 

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

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

相关文章

如何把DAYi-51开发板_做成?

DAYi-51开发板 1> 思维认知1.1> 凡是遇到卡壳&#xff0c;学不下去的情况&#xff0c;只有1个原因1.2> 什么叫掌握了&#xff1f;1.3> 深度练习1.4> 极度专注 2> 环境2.1> 大环境2.2> 贴身环境 3> 技术层面3.1> 找高手 1> 思维认知 1.1> 凡…

攻防世界-web2

原题 解题思路 miwen应该是密文的拼音。在函数encode中&#xff0c;传入字符串str&#xff0c;依次将str中的每一个字符转换为十进制ASCII码加一&#xff0c;然后再转换成字符。逆向思路构建代码如下&#xff1a; <?php $miwen"a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA…

Mac下安装Jmeter及其配置

一、安装JDK环境 安装方式&#xff1a;mac下配置JDK环境_只看不学的博客-CSDN博客 如果已安装JDK环境即可忽略该步骤&#xff0c;检查方式&#xff0c;在终端输入java -version,如果出现了java版本&#xff0c;即代表已经配置过JDK环境了&#xff0c;如下图所示&#xff1a; …

【广州华锐互动】智能变电站AR仿真实训系统大大提高培训的效率和质量

随着电力行业的不断发展&#xff0c;变电站的建设和运维变得越来越重要。传统的变电站运维培训方式存在着诸多问题&#xff0c;如难以真实模拟变电站运行环境、信息传递不及时、难以掌握实际操作技能等问题。而智能变电站AR仿真实训系统可以为变电站运维人员带来全新的培训方式…

2023物联网新动向:WEB组态除了用于数据展示,也支持搭建业务逻辑,提供与蓝图连线和NodeRed规则链类似的可视化编程能力

前言 组态编辑在工业控制、物联网场景中十分常见&#xff0c;越来越多的物联网平台也把组态作为一项标配功能。 物联网产业链自下往上由“端 - 边 - 管 - 云 -用”多个环节构成&#xff0c;组态通常是用于搭建数据展示类型的应用&#xff0c;而随着系统集成度越来越高&#x…

【Unity3D赛车游戏优化篇】新【八】汽车实现镜头的流畅跟随,以及不同角度的切换

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

三维跨孔电磁波CT数据可视化框架搭建

三维跨孔电磁波CT数据可视化框架搭建 文章目录 三维跨孔电磁波CT数据可视化框架搭建1、三维CT可视化结果2、matlab代码2.1、CT数据格式整理并保存2.2、三维可视化 利用matlab实现对跨孔电磁波CT实测数据反演&#xff0c;并搭建了三维CT数据可视化框架&#xff0c;可装填实测CT反…

Android平台GB28181历史视音频文件检索规范探讨及技术实现

技术背景 我们在做Android平台GB28181设备接入侧模块的时候&#xff0c;特别是执法记录仪或类似场景&#xff0c;系统除了对常规的录像有要求&#xff0c;还需要能和GB28181平台侧交互&#xff0c;比如实现设备侧视音频文件检索、下载或回放。本文假定记录仪或相关设备已经完成…

C#循环定时上传数据,失败重传解决方案,数据库标识

有些时候我们需要定时的上传一些数据库的数据&#xff0c;在数据不完整的情况下可能上传失败&#xff0c;上传失败后我们需要定时在重新上传失败的数据&#xff0c;该怎么合理的制定解决方案呢&#xff1f;下面一起看一下&#xff1a; 当然本篇文章只是提供一个思路&#xff0…

使用boost::geometry::union_ 合并边界(内、外)- 方案一

使用boost::geometry::union_ 合并边界&#xff08;内、外&#xff09;&#xff1a;方案一 结合 boost::geometry::read_wkt() 函数 #include <iostream> #include <vector>#include <boost/geometry.hpp> #include <boost/geometry/geometries/point_x…

了解 glTF 2.0 格式

推荐&#xff1a;使用 NSDT场景编辑器快速搭建3D应用场景 介绍 glTF 代表 GL 传输格式。 glTF 是一种用于存储和加载 3D 场景的标准化文件格式&#xff0c;其基本目的是由 3D 创建工具轻松生成并被任何图形应用程序使用&#xff0c;无论使用何种 API&#xff0c;处理最少。 …

Grad-CAM,即梯度加权类激活映射 (Gradient-weighted Class Activation Mapping)

Grad-CAM&#xff0c;即梯度加权类激活映射 (Gradient-weighted Class Activation Mapping)&#xff0c;是一种用于解释卷积神经网络决策的方法。它通过可视化模型对于给定输入的关注区域来提供洞察。 原理: Grad-CAM的关键思想是将输出类别的梯度&#xff08;相对于特定卷积…