用c++实现汉诺塔问题、归并排序

6.1.3  汉诺塔问题


【问题】 汉诺塔问题(Hanio tower problem)来自一个古老的传说:有一座宝塔(塔A),其上有64个金碟,所有碟子按从大到小由塔底堆放至塔顶。紧挨着这座宝塔有另外两座宝塔(塔B和塔C),要求把塔A上的碟子移动到塔C上去,其间可以借助于塔 B。每次只能移动一个碟子,任何时候都不能把一个碟子放在比它小的碟子上面。


【想法】对于n个碟子的汉诺塔问题,可以通过以下三个步骤实现:

(1)将塔A上的n一1个碟子借助塔C先移到塔B上;
(2)将塔A上剩下的一个碟子移到塔C上;

(3)将n-1个碟子从塔B借助于塔 A 移到塔C上。
当n=3时的求解过程如图6-2所示,显然这是一个递归求解的过程

【算法分析】 汉诺塔问题的递归算法存在如下递推关系式:


使用扩展递归技术对递推式进行推导,得到该递推式的解O (2^n)。
算法实现】 设丽数 Hanio 实现将n个碟子从塔A 借助塔B移到塔C上,字符型形参A、B和C表示塔A、塔B和塔C, 程序如下。

#include <iostream>
using namespace std;


void Hanio(int n, char A, char B, char C)
{
if (n == 1)
cout<<A<<"-->"<<C<<"\t";
 else
{
Hanio(n-1, A, C, B);
cout<<A<<"-->"<<C<<"\t";
 Hanio(n-1, B, A, C);
}
}
int main( )
{
char A = 'A', B = 'B', C = 'C';
int n;
cout<<"请输入碟子的个数:";
cin>>n;
Hanio(n, A, B, C);
return 0;
}

 

6.2.1 归并排序


【问题】 归并排序(merge sort)的分治策略如下(图6-3)。
(1)划分:将待排序序列从中间位置划分为两个长度相等的子序列
(2) 求解子问题:分别对这两个子序列进行排序,得到两个有序子序列。
(3) 合并:将这两个有序子序列合并成一个有序序列

【想法】归并排序首先执行划分过程,将序列划分为两个子序列,如果子序列的长度


为1,则划分结束,否则继续执行划分,结果将具有n个记录的待排序序列划分为n个长度为1的有序子序列;然后进行两两合并,得到[n/2]个长度为2(最后一个有序序列的长度可能是1)的有序子序列,再进行两两合并,得到[n/4]个长度为4的有序序列(最后-个有序序列的长度可能小于4),以此类推,直至得到一个长度为n的有序序列。图6-4给出了归并排序的例子。

【算法】 设对数组r[n]进行升序排列,算法如下。
算法:归并排序 MergeSort
输人:待排序数组r[n],待排序区间[s,t]
输出:升序序列r[s]~r[t]
1.如果s等于t,则待排序区间只有一个记录,算法结束;
2.计算划分的位置:m=(s+t)/2;
3.对前半个子序列比r[s]~r[m]进行升序排列;
4.对后半个子序列 r[m+1]~r[t]进行升序排列;
5.合并两个升序序列r[s]~r[m]和r[m+1]~r[t];

【算法分析】 设待排序记录个数为n,则执行一趟合并算法的时间复杂度为O(n).所以,归并排序算法存在如下递推式:

使用扩展递归技术对递推式进行推导,归并排序的时间复杂度是O(nlog以2为底对数n)。

【算法实现】 归并排序的合并操作需要将两个相邻的有序子序列合并为一个有序序列,在合并过程中可能会破坏原来的有序序列,所以,合并不能就地进行。设将有序子序列r[s]~r[m]和r[m+1]~r[t]合并为有序序列r1[s]~rl[t], 再将合并结果传回数组r[s]~r[t],设函数 Merge实现合并操作,函数 MergeSort 实现归并排序,程序如下。

#include <iostream>
using namespace std;
void Merge(int r[ ], int s, int m, int t);
void MergeSort(int r[ ], int s, int t);

int main( )
{
 int i, n = 8, r[8] = {8, 3,2, 6, 7, 1, 5, 4};
    for (i = 0; i < n; i++) {
        cout << r[i] << " ";
    }
    cout << endl;

    MergeSort(r, 0, n - 1);

    for (i = 0; i < n; i++) {
        cout << r[i] << " ";
    }
    cout << endl;

    return 0;
}

void Merge(int r[ ], int s, int m, int t)
{
int r1[t];
int i = s, j = m + 1, k = s;
while (i <= m && j <= t)
{
if (r[i] <= r[j]) r1[k++] = r[i++]; //较小者放入r1[k]
else r1[k++] = r[j++];
}
while (i <= m) //处理第一个子序列剩余记录
r1[k++] = r[i++];
while (j <= t) //处理第二个子序列剩余记录
r1[k++] = r[j++];
for (i = s; i <= t; i++) //将合并结果传回数组r
r[i] = r1[i];
}

void MergeSort(int r[ ], int s, int t) //对序列r[s]~r[t]进行归并排序
{
if (s == t) return; //只有一个记录,已经有序
else
{
int m = (s + t)/2; //划分
MergeSort(r, s, m); //归并排序前半个子序列
MergeSort(r, m+1, t); //归并排序后半个子序列
Merge(r, s, m, t); //合并两个有序子序列
}
}

 

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

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

相关文章

01-xss基本原理

核心:攻击的是前端&#xff0c; 一、课程引入 1、开发一个简单的PHP页面&#xff0c;代码如下&#xff1a; <?php // xss 基础演示代码&#xff1a;从浏览器中接受一个URL地址参数名为content if(isset($_GET[content])){$content$_GET[content];echo "你输入的内容…

再议大模型微调之Zero策略

1. 引言 尽管关于使用Deepspeed的Zero策略的博客已经满天飞了&#xff0c;特别是有许多经典的结论都已经阐述了&#xff0c;今天仍然被问到说&#xff0c;如果我只有4块40G的A100&#xff0c;能否进行全量的7B的大模型微调呢&#xff1f; 正所谓“纸上得来终觉浅&#xff0c;…

进程状态与优先级

Linux内核源代码&#xff1a; 首先我们需要明确一点&#xff0c;Linux操作系统和操作系统的进程状态是不同的 上图大概标识了各个状态对应在操作系统的状态 普通进程 R运行状态&#xff08;running&#xff09;: 并不意味着进程一定在运行中&#xff0c;它表明进程要么是在…

ROS 2边学边练(44)-- 从头开始构建一个视觉机器人模型

前言 从此篇开始我们就开始接触URDF(Unified Robot Description Format&#xff0c;统一机器人描述格式)&#xff0c;并利用其语法格式搭建我们自己的机器人模型。 动动手 开始之前我们需要确认是否安装joint_state_publisher功能包&#xff0c;如果有安装过二进制版本的urdf_…

解密某游戏的数据加密

前言 最近有个兄弟通过我的视频号加我&#xff0c;咨询能否将这个dubo游戏游戏开始前就将数据拿到从而进行押注&#xff0c;于是通过抓包工具测试了下&#xff0c;发现数据有时候是明文&#xff0c;有时候确实密文&#xff0c;大致看了下有这几种加密&#xff1a;Md5aes、Md5&a…

网络层协议之 IP 协议

IP 协议格式 4 位版本&#xff1a;此处的取值只有两个&#xff0c;4&#xff08;IPv4&#xff09;和 6&#xff08;IPv6&#xff09;&#xff0c;即指定 IP 协议的版本。 4 位首部长度&#xff1a;描述了 IP 报头多长&#xff0c;IP 报头是变长的&#xff0c;因为报头中的选项部…

点餐小程序 点餐系统 微信点餐系统 支持微信小程序 支付公众号 可接入第三方配送 全开源uniapp

餐饮连锁v2版-体验后台&#xff08;复制粘贴以下地址到浏览器&#xff0c;打开网址即可登录&#xff0c;) 本文来自&#xff1a;点餐小程序 点餐系统 微信点餐系统 支持微信小程序 支付公众号 可接入第三方配送 全开源uniapp - 源码1688 演示后台&#xff1a;https://diancan.…

异构图神经网络——Heterogeneous Graph Neural Networks

相关代码见文末 1.回顾同构图 1.1 GNN GNN基本计算方法——邻接矩阵乘以节点,聚合相邻节点的特征,得到本节点的特征表达 1.2 Graph Attention Network 引入图注意力,实现边的权重可学习,最简单的方法是,将两个节点的特征进行拼接,使用一组可学习的权重参数映射为边的权…

华为数据之道第一部分导读

目录 导读 第一部分 序 第1章 数据驱动的企业数字化转型 非数字原生企业的数字化转型挑战 业态特征&#xff1a;产业链条长、多业态并存 运营环境&#xff1a;数据交互和共享风险高 IT建设过程&#xff1a;数据复杂、历史包袱重 数据质量&#xff1a;数据可信和一致化…

学习大数据,所需更要的shell基础(2)

文章目录 read读取控制台输入函数系统函数bashnamedirname 自定义函数Shell工具&#xff08;重点&#xff09;cutawk 正则表达式入门常规匹配常用特殊字符 read读取控制台输入 1&#xff09;基本语法 read (选项) (参数) ①选项&#xff1a; -p&#xff1a;指定读取值时的提示…

C++初识多态(1)

1.多态要解决的问题&#xff08;引入&#xff09; 任何一种机制的存在&#xff0c;必然是有其存在的意义的&#xff0c;例如我们前面学过的函数重载&#xff0c;运算符重载&#xff0c;以及引用等等&#xff0c;都是解决一些特殊问题的&#xff1b; 下面通过一些具体的例子&a…

组合模式(Composite)——结构型模式

组合模式(Composite)——结构型模式 组合模式是一种结构型设计模式&#xff0c; 你可以使用它将对象组合成树状结构&#xff0c; 并且能通过通用接口像独立整体对象一样使用它们。如果应用的核心模型能用树状结构表示&#xff0c; 在应用中使用组合模式才有价值。 例如一个场景…

剁手党必看——转转红包使用规则与最优组合计算全解析

​ 1、省钱攻略基础之“了解平台红包使用规则” 2、举个栗子 3、最优红包组合计算方法进化过程 3.1、初代“笛卡尔乘积”版 3.2、二代“边算边比较Map聚合”版 3.3、三代“边算边比较数组索引定位”版 4、总结 1、省钱攻略基础之“了解平台红包使用规则” 规则一&#x…

介绍 ffmpeg.dll 文件以及ffmpeg.dll丢失怎么办的五种修复方法

ffmpeg.dll 是一个动态链接库文件&#xff0c;属于 FFmpeg运行库。它在计算机上扮演着非常重要的角色&#xff0c;因为它提供了许多应用程序和操作系统所需的功能和组件。当 ffmpeg.dll 文件丢失或损坏时&#xff0c;可能会导致程序无法正常运行&#xff0c;甚至系统崩溃。下面…

紫外激光打标机适合在哪些材料表面进行标记

紫外激光打标机适合在多种材料表面进行标记&#xff0c;特别是那些对热敏感或者需要高精度、高清晰度标记的材料。以下是一些常见的适用材料&#xff1a; 1. 塑料&#xff1a;紫外激光打标机在塑料材料上表现尤为出色&#xff0c;因为紫外激光的短波长和高能量密度使得它能够在…

Python | Leetcode Python题解之第70题爬楼梯

题目&#xff1a; 题解&#xff1a; class Solution:def climbStairs(self, n: int) -> int:a, b 1, 1for _ in range(n - 1):a, b b, a breturn b

C语言(操作符)2

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

快速话术本(常用文本快速复制工具)EXE成品+软件源码

功能介绍 经常性需要重复性的输入几个不同的文本&#xff0c;来回复制很麻烦&#xff0c;这个小工具可以帮你解决&#xff0c;把要经常输入的文本添加进去&#xff0c;点击即可复制~ 链接&#xff1a;https://pan.baidu.com/s/1TqtJ_Xb10k4j3dxSRjz47Q?pwdsl4l 提取码&…

如何避免在抓取Google时被屏蔽?代理IP的7个使用误区

在当今数字化时代&#xff0c;数据采集和网络爬取已成为许多企业和个人必不可少的业务活动。对于爬取搜索引擎数据&#xff0c;特别是Google&#xff0c;使用代理IP是常见的手段。然而&#xff0c;使用代理抓取Google并不是一件轻松的事情&#xff0c;有许多常见的误区可能会导…

【FFmpeg】Filter 过滤器 ① ( FFmpeg 过滤器简介 | 过滤器概念 | 过滤器用法 | 过滤器工作流程 | 过滤器文档 | 过滤器分类 )

文章目录 一、FFmpeg 过滤器 Filter 简介1、FFmpeg 过滤器概念2、FFmpeg 过滤器用法3、FFmpeg 过滤器工作流程4、FFmpeg 过滤器文档 二、FFmpeg 过滤器 分类1、过滤器分类 - 根据处理数据类型分类2、过滤器分类 - 根据编码器位置分类3、过滤器分类 - 根据功能分类 FFmpeg 相关文…