[算法导论][练习题]2.1

算法导论题解(二) 算法基础 文章目录1. 插入排序练习 1. 插入排序练习 1-1. 以图2-2为模型,说明INSERTION-SORT在数组A=<31, 41, 59, 26, 41, 58>上的执行过程。 ==解答: == 1-2. 重写INSERTION-SORT,使之按非升序(降序)排序。 # 伪代码 INSERTION-SORT(A) for j = 2 to A.length key = A[j] i = j - 1 while i > 0 and 阅读详情

2.1-1

以图2-2为模型,说明INSERTION-SORT在数组A=<31,41,59,26,41,58>A=<31,41,59,26,41,58>A=<31,41,59,26,41,58>上的执行过程。


答:
图a
图b
图c
图d
图e
图f
图g

  1. 图a显示了数组AAA的初始化状态,也就是数组AAA在排序前的顺序。
  2. 在图b中,我们认定由第1个元素31为已排序的元素,此时我们指定第2个元素41为当前待插入的元素。因为41>31,所以41继续保存在数组第2个元素的位置。此时,数组AAA中已排序的子数组为<31,41><31, 41><31,41>,剩余元素为未排序的。
  3. 在图c中,我们指定数组第3个59元素为当前待插入的元素。因为59>41,所以59继续保存在数组第3个元素的位置。此时,数组AAA中已排序的子数组为<31,41,59><31, 41, 59><31,41,59>,剩余元素为未排序的。
  4. 在图d中,我们指定数组第4个元素26为当前待插入的元素。因为26<59,所以将数组第3个元素移动到第4个元素的位置;因为26<41,所以继续将数组第2个元素移动到第3个元素的位置;又因为26<31,故继续将数组第1个元素移动到第2个元素的位置。因此时数组中再无元素与待插入的元素想比较,故将26保存在数组第1个元素中的位置。此时,数组AAA中已排序的子数组为<26,31,41,59><26, 31, 41, 59><26,31,41,59>,剩余元素为未排序的。
  5. 在图e中,我们指定数组第5个元素41为当前待插入的元素。因为59>41,所以将数组第4个元素移动到第5个元素的位置;但因为41==41,故数组第3个元素不再移动。此时,数组AAA中已排序的子数组为<26,31,41,41,59><26, 31, 41, 41, 59><26,31,41,41,59>,剩余元素为未排序的。
  6. 在图f中,我们指定数组第6个元素58为当前待插入的元素。以为59>58,所以将数组第5个元素移动到第6个元素的位置;而因为41<58,故数组第4个元素不再移动。此时,数组AAA中已排序的子数组为<26,31,41,41,58,59><26, 31, 41, 41, 58, 59><26,31,41,41,58,59>,因为再无剩余的未排序元素,故排序结束。
  7. 在图g中,表示出已排序的数组状态,其中的顺序为排序结果,即经排序后的数组A′=<26,31,41,41,58,59>A'=<26, 31, 41, 41, 58, 59>A′=<26,31,41,41,58,59>。

综上所述,在排序的过程中,数组AAA的变化如下:
A=<31,41,59,26,41,58>A=<31, 41, 59, 26, 41, 58>A=<31,41,59,26,41,58>
A=<31,41,59,26,41,58>A=<31, 41, 59, 26, 41, 58>A=<31,41,59,26,41,58>
A=<31,41,59,26,41,58>A=<31, 41, 59, 26, 41, 58>A=<31,41,59,26,41,58>
A=<26,31,41,59,41,58>A=<26, 31, 41, 59, 41, 58>A=<26,31,41,59,41,58>
A=<26,31,41,41,59,58>A=<26, 31, 41, 41, 59, 58>A=<26,31,41,41,59,58>
A=<26,31,41,41,58,59>A=<26, 31, 41, 41, 58, 59>A=<26,31,41,41,58,59>

2.1-2

重写过程INSERTION-SORT,使之按非升序(而不是非降序)排序。


答:

INSERTION-SORT-DESC(A)
	for j = 2 to A.length
		key = A[j]
		// Insert A[j] into the sorted sequence A[1 .. j-1]
		i = j - 1
		while i > 0 and A[i] < key
			A[i + 1] = A[i]
			i = i - 1
		A[i + 1] = key

2.1-3

考虑以下查找问题:
输入:nnn个数的一个序列A=<a1,a2,...,an>A=<a_1,a_2, ...,a_n >A=<a1​,a2​,...,an​>和一个值vvv。
输出:下标iii使得v=A[i]v=A[i]v=A[i]或者当vvv不在AAA中出现时,vvv为特殊值NIL。
写出线性查找的伪代码,它扫描整个序列来查找vvv。使用一个循环不变式来证明你的算法时正确的。确保你的循环不变式满足三条必要的性质。


答:

  • 算法伪命题
LINEAR-SEARCH(A, v)
	for i = 1 to A.length
		if A[i] == v
			return i
	return NIL

此处将“当vvv不在AAA中出现时,vvv为特殊值NIL”,改成“当vvv不在AAA中出现时,返回特殊值NIL”

  • C#语言实现
private static int LinearSearch(int[] array, int value)
{
	for(int i = 0; i < array.Length; i++)
	{
		if(array[i] == value)
		{
			return i;
		}
	}

	return -1;
}
  • 证明
  1. 循环不变式:在for循环的每次迭代开始时,子数组[1 … i - 1]由不同于vvv的元素组成。
  2. 初始化:在第一次循环迭代(i=1)之前,子数组是空数组,所以证明循环不变式成立。
  3. 保持:在每次循环迭代中,我们将vvv与A[i]A[i]A[i]进行比较。如果它们是相同的,我们返回iii,这是正确的结果。否则,我们将继续进行循环的下一个迭代。在每次循环迭代结束时,我们知道子数组A[1..i]A[1 .. i]A[1..i]不包含vvv,所以循环不变性保持正确。为循环的下一次迭代增加iii,然后保持循环不变。
  4. 终止:当i>A.length=ni > A.length = ni>A.length=n时,循环结束。因为iii已经被增加了1,所以此时iii的值是n+1n + 1n+1。此时,对应于循环不定式中的描述,我们有子数组A[1..n]A[1 .. n]A[1..n]由不同于vvv的元素组成。因此返回NIL。
    观察到A[1…n]A[1…n]A[1…n],我们得出结论,整个数组没有任何等于vvv的元素,因此该算法是正确的。

2.1-4

考虑把两个nnn位二进制整数加起来的问题,这两个整数分别存储在两个nnn元数组AAA和BBB中。这两个整数的和应按二进制形式存储在一个(n+1n+1n+1)元数组C中。请给出该问题的形式化描述,并写出伪代码。


答:

  • 输入:一个布尔类型的数组A=<a1,a2,...,an>A = <a_1, a_2, ... , a_n>A=<a1​,a2​,...,an​>,以及另一个布尔类型的数组B=<b1,b2,...,bn>B = <b_1, b_2, ... , b_n>B=<b1​,b2​,...,bn​>。数组AAA和数组BBB均表示为一个整数的二进制表示(数组中的每一个元素是0或1,对应于二进制位中的对应数位),每一个数组的长度均是nnn。
  • 输出:一个数组C=<c1,c2,...,cn+1>C = <c_1, c_2, ... , c_{n+1}>C=<c1​,c2​,...,cn+1​>。这个数组CCC表示的是C′=A′+B′C' = A' + B'C′=A′+B′的结果,其中A′A'A′表示数组AAA、‘B’‘表示数组BBB,而C′C'C′表示数组’C’。

伪代码:

ADD-WITH-BINARY-BITS(A, B)
	C = new integer[A.length + 1]

	carry = 0
	for i = 1 to A.length
		temp = A[i] + B[i] + carry
		C[i] = temp % 2
		carry = temp / 2
	C[n + 1] = carry

	return C

c#代码:

static int[] AddWithBinaryBits(int[] A, int[] B)
{
	int[] result = new int[A.Length + 1];

	int carry = 0;
	for(int i = 0; i < A.Length; i++)
	{
		int temp = A[i] + B[i] + carry;
		result[i] = temp % 2;
		carry = temp / 2;
	}
	result[A.Length] = carry;

	return result;
}
算法导论练习题2.1 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 算法导论-插入排序一、2.1插入排序二、练习2.1-22.1-32.1-4总结 一、2.1插入排序 二、练习 2.1-2 代码如下(示例): class Solution(object): def generate(self, A): """ :type numRows: int :rtype: List[List[int]] """ for j in 阅读详情

相关推荐

算法导论练习题4.1-4.2

文章目录4.1最大子数组4.1-14.1-24.1-44-1.54.2矩阵乘法的Strassen算法 4.1最大子数组 按照书中分治思想的代码: def find_max_crossing_subarray(A, low, high): left_sum = -float('inf') S_left = 0 mid = (low + high) // 2 for i in range(mid, low - 1, -1): S_left = S_left +

M2962244239的博客 650

算法导论 2.1-3 线性查找问题

考虑以下查找问题。 输入:n个数的一个序列 A = <a1, a2, ... , an> 和一个值v 。 输出:下标 i 使得 v = A[i] 或者当 v 不在 A 中出现时,v 为特殊值 NIL 。 写出线性查找的伪代码,它扫描整个序列来查找 v 。使用一个循环不变式来证明你的算法是正确的。确保你的循环不变式满足三条必要的性质。 以下是循环不变式的证明。 初始化:首先证明在第一次循环迭代之前(当 j = 1 时),循环不变式成立。这时子数组为空,由于没有子数组没有任何数据,即没

madaxin的博客 1529

Coze离线部署实战:从镜像拉取到服务启动的完整避坑指南

本文提供了一份详尽的Coze平台离线部署实战指南。针对无外网的生产环境,详细讲解了从Docker镜像拉取、打包传输到内网服务器加载的完整流程,并重点剖析了使用docker-compose启动服务时常见的配置错误与权限问题,如文件挂载缺失、网络绑定错误等,提供了经过验证的避坑解决方案,旨在帮助运维和开发人员一次性成功部署。

weixin_29310605的博客 328

算法导论第二章练习参考答案

2.1-3 考虑以下查找问题: 输入:n个数的一个序列A=<a1,a2,⋯ ,an>A=<a_1,a_2,\cdots,a_n>A=<a1​,a2​,⋯,an​>和一个值vvv。 输出:下标iii使得A[i]=vA[i]=vA[i]=v或者当vvv不在AAA中出现时,vvv为特殊值NILNILNIL 写出线性查找的伪代码,它扫描整个序列来查找vvv。使用一个循环...

suchvaliant的博客 980

CH340驱动安装全攻略:从Windows到MacOS的避坑指南(2025最新版)

本文提供2025年最新版CH340驱动安装全攻略,涵盖Windows、MacOS和Linux三大操作系统。详细解析了驱动安装的核心原理、标准流程,并针对Windows设备管理器报错、MacOS系统安全限制等常见“坑点”提供了深度排错与解决方案,旨在帮助开发者快速稳定地完成USB转串口通信配置。

earth的博客 426

Outlook日历同步全攻略:Win10+安卓+iOS三端无缝衔接(附常见问题解决)

本文提供了一份详尽的Outlook日历同步指南,帮助用户在Windows 10、安卓和iOS三端实现无缝衔接。文章深入解析了Exchange ActiveSync等核心同步原理,并给出了从账户创建到各设备(特别是华为手机)的具体配置步骤、进阶管理技巧以及针对同步失败、事件重复等常见问题的实战解决方案,旨在彻底解决跨平台日程管理的痛点。

l3m4n的博客 554

birt脚本for循环语句_如何使用 for 循环语句嵌套方法!

for循环语法:for( 表达式1;表达式2;表达式3){ 循环体}循环从表达式1开始 - 表达式2(判别表达式)- 真 - 执行循环体 - 表达式3 - 判断表达式2真 : 继续 — 循环体—表达式3 — 表达式2假 :跳出循环(正常情况下,for循环的出口是表达式2)练习:使用for循环,求1-100的和?for循环的变换形式循环因子:a、在for循环之前定义,在for循环,结束后依然能使用。...

weixin_39715834的博客 240

ArcGis布局视图中Excel表格无边框插入与图例符号边框定制技巧

本文详细解析了在ArcGis布局视图中实现Excel表格无边框插入与图例符号边框定制的专业技巧。通过源头净化Excel表格、精准粘贴以及分解图例并单独设置边框属性,有效解决了地图报告中常见的视觉粗糙问题,帮助用户提升专题图与报告的精致度与专业感。

weixin_29292535的博客 305

《算法导论》习题2.1-3

题目考虑以下查找问题: 输入: n个数的一个序列A={ a1, a2, ..., an }A = \{\ a_1,\ a_2,\ ...,\ a_n\ \} 和一个值vv。 输出: 下标ii使得v=A[i]v=A[i]或者当vv不在AA中时,vv为特殊值NIL。 写出线性查找 的伪代码,它扫描整个序列来查找vv。使用一个循环不变式来证明你的算法是正确的。确保循环不变式满足三条必要的性质。

小幻的博客 2525

机器人多学科仿真软件:Webots_(19).Webots的插件与扩展开发

通过上述步骤,您可以开发和使用Webots的插件、扩展和接口,以增强其功能和灵活性。

kkchenjj的博客 925

具身智能机器人算法控制研究进展综述

具身智能(Embodied Intelligence)作为人工智能与机器人学的交叉前沿领域,强调智能体通过物理身体与环境的持续交互涌现智能行为。近年来,随着基础模型(Foundation Models)、扩散策略(Diffusion Policy)、视觉-语言-动作(Vision-Language-Action, VLA)模型以及大规模机器人数据集(如Open X-Embodiment)的快速发展,具身智能机器人的算法控制范式正经历深刻变革。

VectorShift的博客 229

[算法导论][练习题]1.2

1.2-1 给出一个实际应用的例子,它在应用这一层次上要求有算法性的内容。讨论其中所涉及的功能。 在现在的网约车服务中,为了节省油费以及时间,服务平台需要自动为司机选择一条最短路径作为导航。同时,也为了节省乘客的时间,通常会通过一定的算法来避免堵车。 1.2-2 假设我们要比较在同一台计算机上插入排序和合并排序的实现。对于规模为n的输入,插入排序要运行8n28n^28n2步,而合并排序要运行64nlog⁡2n64n\log_2n64nlog2​n步。当n取怎样的值时,插入排序的性能要优于合并排序? 8n2&

火云的专栏 195

SAP 合并报表(EC-CS)完整方法论 + 全业务操作步骤

SAP合并报表(EC-CS)方法论与操作指南摘要 SAP EC-CS模块提供完整的集团合并解决方案,其核心方法论基于会计准则和集团管控逻辑,通过6大维度构建标准化合并体系:组织架构标准化、数据采集标准化、外币换算规则化、内部交易自动化抵消、股权与商誉规范化、报表出具灵活化。 实施过程分为两个阶段: 上线前配置阶段(12个步骤):包括合并架构搭建、科目表配置、外币规则设定、抵消规则定义等基础工作 日常操作阶段(10个步骤):涵盖数据报送、外币换算、内部对账、自动抵消、调整分录等月结流程 系统优势包括: 支持多

金牌架构师 1365

算法导论 练习题 20.2-1

1

苦海无涯闯进来 589

机器学习笔记——30种常见机器学习算法简要汇总

本笔记介绍机器学习中常见的30种机器学习算法。

haopinglianlian的博客 3199

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

《算法导论》练习题 2.1-4

2.1-4 有两个各存放在数组A和B中的n位二进制整数,考虑它们的相加问题。两个整数的和以二进制形式存放在具有(n+1)个元素的数组C中。请给出这个问题的形式化描述,并写出伪代码。自己写的java解决方案。没有找到标准答案,先放上来吧,不一定很好。不过运行结果正确。package

puweilan的专栏 2335

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

算法导论 练习题 6.1-2

1

苦海无涯闯进来 483

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

算法导论 练习题 3.1-2

1、当a>0 取n0>=max(1,a)任一常量,c1=1,c2=2的b次方,则 01*n的b次方2*n的b次方 2、当a 取n01=1,c2=4的b次方(2的b次方的平方),则 0c1*n的b次方2*n的b次方 3、当a=0 显然成立。

苦海无涯闯进来 722

算法导论 练习题 2.1-2

#include <stdio.h>void insertSort(int a[],int len) { for(int i=1;i<len;i++) { int key=a[i],j=i-1; while(j>=0 && a[j]<key) { a[j+1]=a[j]; j--;

苦海无涯闯进来 498

算法导论 练习题 11.2-1

1

苦海无涯闯进来 610

算法导论 练习题 5.2-1

1

苦海无涯闯进来 367

算法导论 练习题 7.1-2

1

苦海无涯闯进来 1453

算法导论 练习题 16.1-2

1

苦海无涯闯进来 967

算法导论 练习题 11.1-2

1

苦海无涯闯进来 542

算法导论 练习题 17.2-1

1

苦海无涯闯进来 984

算法导论 练习题 5.1-2

1

苦海无涯闯进来 1002
上一篇: [算法导论][算法实现与分析]插入排序
下一篇: [算法导论][算法实现与分析]选择排序
cloudblaze
博客等级 码龄17年 81粉丝 125原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值