基础算法-分治算法-学习

现象:

基础算法-分治算法-学习

分而治之,将复杂问题分成小问题,小问题直接求解,最后合并得到最终结果,
和递归思想有点相近,也是区分小问题自己解决,所以在分治算法很多以递归的方式实现
每个递归就是等于分成一个小问题去解决

通用案例:

一:汉诺塔问题

现在有三根柱子 A、B、C
* A柱子有从小到大N个盘子
* 现在要借助B柱子 将A柱子所有盘子移动到C柱子
* 条件:1-每次只能移动一个盘子、2-大盘子绝对不能放在小盘子上面
* 求移动盘子的次数

在这里插入图片描述
解决思路:
每次将问题分治
* 如果A塔上有多个盘分三步治理
* 第一步:将A柱子除最后一个盘所有盘移动到B柱子,
* 第二步:将A柱子最后一个盘移动到C柱子,
* 第三步:最后将B柱子的所有盘移动到C柱子
*
* 第一步和第三步又判断是不是多盘 是多盘则继续分上三步走(递归调用) 第二步单盘操作不需要递归

结果展示:

当A柱子有三个盘子的移动操作

在这里插入图片描述

当A柱子有五个盘的操作

在这里插入图片描述

代码方法:

   public static void main(String[] args) {var i = partitionAlgorithm(5, "A", "B", "C");log.debug("总移动步骤:{}",i);}public static int partitionAlgorithm(int num, String one, String two, String three) {// 盘子数量=1  不借助中间柱子 直接从A柱子移动到C柱子 一步完成if (num == 1) {log.debug("将第{}个盘子从{}柱子移动到{}柱子",num, one, three);return 1;} else {/*** 盘子数量大于1* 需要借助中间的柱子来移动* 第一步 先将a柱子移动到B柱子* 第二步 将a柱子移动到c柱子* 第三步 将b柱子移动到c柱子*/var s1 = partitionAlgorithm(num - 1, one, three, two);log.debug("将第{}个盘子从{}柱子移动到{}柱子",num, one, three);var s3 = partitionAlgorithm(num - 1, two, one, three);return s1+s3+1;}}

通用案例:

快速排序
分治思想的排序操作
给定一个数组用分治思想实现快速排序

 * 解答思路:* 第一步:在数组中选一个基础值一般就是第一个值* 第二步:遍历此数组将大于基础值的放右边、小于基础值的放左边*  对左边和右边的值 在分别递归第一步和第二步操作 直到剩下一个值为止

快速排序双指针方式步骤:

  • 第一步:选定数组中第一个值作为基数
  • 第二步:指定两个指针一个从最左开始,一个从最右开始
  • 第三步:循环 右指针值与基数值判断
    • 如果比基数大就 右指针左移 如果比基数小则停止
  • 第四步:循环 左指针与基数值判断
    • 如果比基数小就 左指针右移 如果比基数大则停止
  • 第五步:左右指针都停止了
    • 此时右边指针对应的值小于基数
    • 左指针对应的值大于基数
    • 调换两个基数的值
  • 第六步:循环 三、四、五步 直到指针在中间相遇
    •  此时这个相遇位置就是基数的正确位置
      
    •  右边都大于基数
      
    •  左边都小于基数
      
  • 第七步:调转基数和指针相遇位置,使基数到达自己的正确位置
  • 第八步:将基数左边的子数组 递归调用,将基数右边的子数组也递归调用

在这里插入图片描述

调用结果:

在这里插入图片描述

代码方法:

    public static void main(String[] args) {int[] a={8,2,6,5,9,1,7,4};quickSort(a,0,a.length-1);for (int i=0;i<a.length-1;i++){System.out.printf("---"+a[i]);}}/*** 快速排序* 分治思想的排序操作* 给定一个数组用分治思想实现快速排序** 解答思路:* 第一步:在数组中选一个基础值一般就是第一个值* 第二步:遍历此数组将大于基础值的放右边、小于基础值的放左边*      对左边和右边的值 在分别递归第一步和第二步操作 直到剩下一个值为止**  快速排序双指针方式步骤:*  第一步:选定数组中第一个值作为基数*  第二步:指定两个指针一个从最左开始,一个从最右开始*  第三步:循环 右指针值与基数值判断*      如果比基数大就 右指针左移   如果比基数小则停止*  第四步:循环 左指针与基数值判断*      如果比基数小就 左指针右移  如果比基数大则停止*  第五步:左右指针都停止了*      此时右边指针对应的值小于基数*      左指针对应的值大于基数*      调换两个基数的值*  第六步:循环 三、四、五步 直到指针在中间相遇*      此时这个相遇位置就是基数的正确位置*      右边都大于基数*      左边都小于基数*  第七步:调转基数和指针相遇位置,使基数到达自己的正确位置*  第八步:将基数左边的子数组 递归调用,将基数右边的子数组也递归调用*/public static void quickSort(int[] ints,int start,int end) {if(start < end){// 第一步:第一个元素 作为基数var startInt = ints[start];// 第二步:第一个值和最后一个值的基础状态作为左右指针int left = start;int right = end;// 左指针小于右指针作为循环条件   每次两个指针相遇则跳出循环while (left < right){// 对应第三步  循环 右指针值与基数值判断while (ints[right] >= startInt && left < right){right--;}// 对应第四步  循环 左指针与基数值判断while (ints[left] <= startInt && left < right){left++;}// 对应第五步  左右指针都停止了  此时右指针的值大于基数  左指针的值小于基数 调换指针数值if(left < right){int temp = ints[left];ints[left] = ints[right];ints[right] = temp;}}// 对应第七步  跳出了循环 说明第一轮已经结束 次数指针已经交汇在一起  指针交汇位置就是基数的正确位置 将基数与指针交汇处转换数值int temp = ints[left];ints[left] = ints[start];ints[start] = temp;// 对应第八步:递归左边的子数组quickSort(ints,start,left-1);// 对应第八步:递归右边的子数组quickSort(ints,left+1,end);}}

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

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

相关文章

【Leetcode每日一题】 递归 - 反转链表(难度⭐)(35)

1. 题目解析 题目链接&#xff1a;206. 反转链表 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 一、递归函数的核心任务 递归函数的主要职责是接受一个链表的头指针&#xff0c;并返回该链表逆序后的新头结点。递归…

【研发日记】Matlab/Simulink技能解锁(五)——Simulink布线技巧

前言 见《【研发日记】Matlab/Simulink技能解锁(一)——在Simulink编辑窗口Debug》 见《【研发日记】Matlab/Simulink技能解锁(二)——在Function编辑窗口Debug》 见《【研发日记】Matlab/Simulink技能解锁(三)——在Stateflow编辑窗口Debug》 见《【研发日记】Matlab/Simulink…

可变形卷积v4 |更快更强,效果远超DCNv3

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;助力高效涨点&#xff01;&#xff01;&#xff01; 一、论文摘要 我们介绍了可变形卷积v4 (DCNv4)&#xff0c;这是一种高效的算子&#xff0c;专为广泛的视觉应用而设计。DCNv4通过两个关键增强解决了…

【Canvas与艺术】时尚钟表

【实现效果图示】 【实现代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>时尚钟表</title></head><body onload&…

如何使用ChatGPT快速写出一篇完美论文?

原文链接&#xff1a;如何使用ChatGPT快速写出一篇完美论文&#xff1f;https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247597847&idx2&sneaad4282191a165c08a78fbf5c6a47aa&chksmfa823ef0cdf5b7e619433e27b1249a3d57384dc052276bfb86c681e2069e0566ed…

Solo 开发者周刊 (第7期):Sora出世,或许又一行业将会消失?

这里会整合 Solo 社区每周推广内容、产品模块或活动投稿&#xff0c;每周五发布。在这期周刊中&#xff0c;我们将深入探讨开源软件产品的开发旅程&#xff0c;分享来自一线独立开发者的经验和见解。本杂志开源&#xff0c;欢迎投稿。 好文推荐 sora未来在哪里&#xff0c;是否…

《汇编语言》- 读书笔记 - 第17章-外传之 DOSBox-X 调用 int 13 读写磁盘

《汇编语言》- 读书笔记 - 第17章-外传之 DOSBox-X 调用 int 13 读写磁盘 总结dosbox-x.conf 不完美读取成功写入成功参考资料 总结 DOSBox 中访问 int 13h 始终没反应。网上查了下有人说是没支持&#xff0c;建议使用 DOSBox-X 经过无数遍尝试后&#xff1a; 环境状态Win11…

15届蓝桥杯第二期模拟赛题单详细解析

文章目录 &#x1f9e1;&#x1f9e1;t1_求余&#x1f9e1;&#x1f9e1;思路代码 &#x1f9e1;&#x1f9e1;t2_灌水&#x1f9e1;&#x1f9e1;思路代码 &#x1f9e1;&#x1f9e1;t3_字符显示&#x1f9e1;&#x1f9e1;思路代码 &#x1f9e1;&#x1f9e1;t4_区间最大和…

Liunx下安装Redis(详细安装)

1、创建一个文件目录 mkdir /opt/redis2、进入安装目录 cd /opt/redis3、下载redis默认安装包 默认是3.0版本的 wget http://download.redis.io/releases/redis4、进行解压 tar -xzvf redis-3.0.7.tar.gz5、进入解压好的文件夹目录 cd redis-3.0.7 6、将redis重新安装到 …

C语言:操作符详解(下)

目录 一、逗号表达式二、下标访问[ ]、函数调用()1. [ ]下标引用操作符2.函数调用操作符 三、结构成员访问操作符1.结构体(1) 结构的声明(2) 结构体变量的定义和初始化 2.结构成员访问操作符(1)结构体成员的直接访问(2)结构体成员的间接访问 四、操作符的属性&#xff1a;优先级…

数据集成平台选型建议

一 数据集成介绍 数据集成平台是一种用于管理和协调数据流动的软件工具或服务。它的主要目标是将来自多个不同数据源的数据整合到一个统一的、易于访问和分析的数据存储库中。这些数据源可以包括数据库、云应用、传感器、日志文件、社交媒体等等。数据集成平台的关键任务是确保…

matlab去除图片上的噪声

本问题来自CSDN-问答板块,题主提问。 如何利用matlab去除图片上的噪声? 一、运行效果图 左边是原图,右边是去掉噪音后的图片。 二、中文说明 中值滤波是一种常见的图像处理技术,用于去除图像中的噪声。其原理如下: 1. 滤波器移动:中值滤波器是一个小的窗口,在图像上移…