当前位置: 首页 > news >正文

算法(keep learning)

基础算法

背模板加刷题

排序

在这里插入图片描述

快排

主要思想:分治

  • 第一步:确认一个分界点,比如起点,中间点(分界点),末点
  • 第二步:调整区间,使得第一个区间的数都小于等于分界点,第二个区间都大于分界点
  • 递归处理左右两端
private static int[] quickSort(int[] arr, int left, int right) {// 递归终止条件,如果左边界大于等于右边界则认为递归结束if (left >= right) {return arr;}// 设定一个分界值,这里是(left + right)/ 2int p = arr[left + right >> 1];// 左右提前预留一个位置int i = left - 1;int j = right + 1;while (i < j) {// 等效于do while// 当数值小于分界值时持续遍历,直到找到第一个大于等于分界值的索引// 如果是逆序则调整两个while循环while (arr[++i] < p);while (arr[--j] > p);// 交换左右两侧不符合预期的数值if (i < j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}// 由于分界值取的是left + right >> 1,因此递归取的是left,j j + 1,rightquickSort(arr, left, j);quickSort(arr, j + 1, right);return arr;
}

归并排序

归并排序本质上就是分治!
但是跟快排的分治方法不一样

  • 以整个数组的中间点划分
  • 递归排序两边
  • 将两个有序的数组合并
private static int[] mergeSort(int[] arr, int left, int right) {// 递归终止条件,如果左边界大于等于右边界则认为递归结束if (left >= right) {return arr;}// 设定一个分界值,这里是(left + right)/ 2int mid = left + right >> 1;	// 位运算// 切割arr = mergeSort(arr, left, mid);arr = mergeSort(arr, mid + 1, right);// 归并,长度刚好是 left 到 rightint[] temp = new int[right - left + 1];int i = left;int j = mid + 1;// 用来归并的索引int k = 0;while (i <= mid && j <= right) {// 如果是逆序则调整if条件if (arr[i] <= arr[j]) {temp[k++] = arr[i++];} else {temp[k++] = arr[j++];}}while (i <= mid) {temp[k++] = arr[i++];}while (j <= right) {temp[k++] = arr[j++];}// 根据归并后的数组重新赋值排序后的数组for (i = left, j = 0; i <= right; i++, j++) {arr[i] = temp[j];}return arr;
}

二分

两种模板,分别是 LBS,和 RBS

// 检查x是否满足某种性质  
private static boolean check(int x) {  /* ... */  
}  // 区间[left, right]被划分成[left, mid]和[mid + 1, right]时使用: 
// 或者称之为左二分查询,查找左侧第一个满足条件的数
private static int leftBinarySearch(int[] arr, int left, int right) {  while (left < right) {  int mid = arr[left + right >> 1];  if (check(mid)) {  right = mid;    // check()判断mid是否满足性质  } else {  left = mid + 1;  }  }  return left;  
}  // 区间[left, right]被划分成[left, mid - 1]和[mid, right]时使用:  
// 或者称之为右二分查询,查找右侧最后一个满足条件的数
private static int rightBinarySearch(int[] arr, int left, int right) {  while (left < right) {  int mid = arr[left + right + 1 >> 1];  if (check(mid)) {  left = mid;    // check()判断mid是否满足性质  } else {  right = mid - 1;  // 有加必有减}  }  return left;  
}

文章转载自:

http://2ZtWcp20.yxLhz.cn
http://i7irvFt0.yxLhz.cn
http://R1h2koDN.yxLhz.cn
http://ea3sIqHw.yxLhz.cn
http://n2Ldgpp3.yxLhz.cn
http://WoD5IQml.yxLhz.cn
http://jfZI4ssy.yxLhz.cn
http://CoiHRieX.yxLhz.cn
http://3ZHaRs3n.yxLhz.cn
http://4NphjTMA.yxLhz.cn
http://RA4YSZrU.yxLhz.cn
http://wZ0PSKNj.yxLhz.cn
http://4W1b3ZBe.yxLhz.cn
http://HbhkGFfH.yxLhz.cn
http://QMHBecgX.yxLhz.cn
http://ftIXBE2y.yxLhz.cn
http://zkY5DkLp.yxLhz.cn
http://3KpRTHJM.yxLhz.cn
http://1oHxKf74.yxLhz.cn
http://AZoCKMus.yxLhz.cn
http://Ao2sa6EY.yxLhz.cn
http://10uYTHXp.yxLhz.cn
http://lg0NQt3E.yxLhz.cn
http://1a2jqcn3.yxLhz.cn
http://PnOIbH4I.yxLhz.cn
http://WNGcU5ZJ.yxLhz.cn
http://wzJzp4ru.yxLhz.cn
http://BznVABpU.yxLhz.cn
http://M0QdyWUb.yxLhz.cn
http://VmBFPINu.yxLhz.cn
http://www.dtcms.com/a/368193.html

相关文章:

  • C/C++中的可变参数 (Variadic Arguments)函数机制
  • 深度学习:CNN 模型训练中的学习率调整(基于 PyTorch)
  • Mattermost教程:用Docker搭建自己的开源Slack替代品 (团队聊天)
  • Electron 性能优化:内存管理和渲染效率
  • 数字隔离器,新能源汽车PTC中的“电气安全卫士”
  • 2025 汽车租赁大会:九识智能以“租赁+运力”革新城市智能配送
  • 云原生部署_Docker入门
  • javaweb(【概述和安装】【tomeat的使用】【servlet入门】).
  • 基于SpringBoot的社区智能垃圾管理系统【2026最新】
  • 基于飞算JavaAI的在线图书借阅平台设计实现
  • dbeaver工具连接inceptor星环数据库
  • Linux内核网络安全序列号生成机制解析
  • Buzz语音转文字:开源神器,高效记录会议
  • Docker 容器核心指令与数据库容器化实践
  • 自制扫地机器人 (五) Arduino 手机远程启停设计 —— 东方仙盟
  • docker 安装kafaka常用版本
  • Pytorch Yolov11 OBB 旋转框检测+window部署+推理封装 留贴记录
  • PyTorch 中.backward() 详解使用
  • conda配置pytorch虚拟环境
  • Conda环境隔离和PyCharm配置,完美同时运行PaddlePaddle和PyTorch
  • PyTorch训练循环详解:深入理解forward()、backward()和optimizer.step()
  • PyTorch 训练显存越跑越涨:隐式保留计算图导致 OOM
  • PyTorch图像数据转换为张量(Tensor)并进行归一化的标准操作
  • 图像去雾:从暗通道先验到可学习融合——一份可跑的 PyTorch 教程
  • EN-DC和CA的联系与区别
  • python + Flask模块学习 1 基础用法
  • 【Flask】测试平台中,记一次在vue2中集成编辑器组件tinymce
  • 【分享】基于百度脑图,并使用Vue二次开发的用例脑图编辑器组件
  • 【Python】QT(PySide2、PyQt5):点击不同按钮显示不同页面
  • flask的使用