2.1 insertion sort 《算法导论》答案
2.1 insertion sort 《算法导论》答案

2.1-1
Using Figure 2.2 as a model, illustrate the operation of INSERTION-SORT on the array A ={31; 41; 59; 26; 41; 58}
这一题很简单,自己想一想过程。(figure 2.2是升序)
2.1-2
Rewrite the INSERTION-SORT procedure to sort into non-increasing instead of non-decreasing order.
这一题用c语言代码来写:
- 降序
#include <stdio.h>
int main()
{
int i,j,right_hand;
int card[10]={1,2,3,4,5,6,7,8,9,10};
for(i=1;i<=9;i++)
{
right_hand=card[i];
j=i-1;
while(j>=0&&card[j]<right_hand)
{
card[j+1]=card[j];
j--;
}
card[j+1]=right_hand;
}
for(i=0;i<10;i++)
printf("%d ",card[i]);
return 0;
}
- 升序
#include <stdio.h>
int main()
{
int i,j,right_hand;
int card[10]={10,9,8,7,6,5,4,3,2,1};
for(i=1;i<=9;i++)
{
right_hand=card[i];
j=i-1;
while(j>=0&&card[j]>right_hand)
{
card[j+1]=card[j];
j--;
}
card[j+1]=right_hand;
}
for(i=0;i<10;i++)
printf("%d ",card[i]);
return 0;
}
2.1-3
Consider the searching problem:
Input: A sequence of n numbers A = {a1; a2; : : : ;} and a value.
Output: An index i such that v = A[i] or the special value NIL if does not appear in A.
Write pseudocode for linear search, which scans through the sequence, looking for v. Using a loop invariant, prove that your algorithm is correct. Make sure that your loop invariant fulfills the three necessary properties.
这一题并不简单:所谓的linear search在这里可以理解为简单的一个一个找。写出代码为:
#include <stdio.h>
#define NIL -1
int linear_search(int v,int *a)
{
int i;
for(i=0;i<=9;i++)
if(a[i]==v)
return i;
return NIL;
}
int main()
{
int p[10]={1,2,3,4,5,6,7,8,9,10};
int result;
int v;
scanf("%d",&v);
result=linear_search(v, p);
printf("%d",result);
return 0;
}
证明:
我在Google找了不少答案,但都不是令人那么满意。最终在Stack Overflow上找到了一个不错的答案。这里我都给大家放上来,以供大家参考,有可能需要科学上网,也需要懂一点点英文。
现在我自己来写一下:
- loop invariant:v不等于a[j](\(0\le j\le i-1\)),但v有可能等于a[j](\(i\le j\le n\))。这个\(0\le j\le i-1\)非常关键,如果我们写成了\(0\le j\le i\)这一题有可能就证不出来了。
- initialization:当i=0时,我们会发现我们需要证明的v不会出现在a[0]~a[-1]之中,但有可能出现在a[0]~a[n]之中。a[0]~a[-1]明显是个空集,v怎么可能会出现在空集之中,所以这里初始化正确。
- maintenance:我们进行一次迭代。我们来分类讨论:1.如果v=a[i],函数就会被立刻返回i。不过这个仍然满足循环不变式。2.如果v!=a[i],会进行i会自加一次,仍然符合循环不变式。
- termination:当我们进行最后一次迭代时,i=n+1时,v仍不在a[0]~a[n]之中,所以仍符合循环不变式。但此时会返回NIL。
2.1-4
Consider the problem of adding two n-bit binary integers, stored in two n-element arrays A and B. The sum of the two integers should be stored in binary form in an (n+1)-element array C. State the problem formally and write pseudocode for adding the two integers.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,i,temp,temp1=0;
printf("please input how much bit is number\n");
scanf("%d",&n);
int *a,*b,*c;
a=malloc(n*sizeof(int));
b=malloc(n*sizeof(int));
c=malloc((n+1)*sizeof(int));
printf("please input the first binary integer\n");//输入时,数字之间要加上空格。
for(i=0;i<n;i++)
scanf("%d",&a[i]);
printf("please input the second binary integer\n");
for(i=0;i<n;i++)
scanf("%d",&b[i]);
for(i=n;i>=1;i--)
{
temp=a[i-1]+b[i-1]+temp1;
if(temp>=2)
{
c[i]=a[i-1]+b[i-1]-2+temp1;
temp1=1;
}
else
{
c[i]=a[i-1]+b[i-1]+temp1;
temp1=0;
}
}
if(temp1==1)
c[0]=1;
else
c[0]=0;
for(i=0;i<=n;i++)
printf("%d",c[i]);
printf("\n");
return 0;
}
算法思想就是普通的二进制加法,逢二进一。
2.1 insertion sort 《算法导论》答案的更多相关文章
- 跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort)
跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort) 选择排序(selection sort) 算法原理:有一筐苹果,先挑出最大的一个放在最后,然后 ...
- MIT算法导论——第五讲.Linear Time Sort
本栏目(Algorithms)下MIT算法导论专题是个人对网易公开课MIT算法导论的学习心得与笔记.所有内容均来自MIT公开课Introduction to Algorithms中Charles E. ...
- 排序算法 - 插入排序(Insertion sort)
插入排序对于少量元素的排序是很高效的,而且这个排序的手法在每个人生活中也是有的哦. 你可能没有意识到,当你打牌的时候,就是用的插入排序. 概念 从桌上的牌堆摸牌,牌堆内是杂乱无序的,但是我们摸上牌的时 ...
- 【算法】插入排序(Insertion Sort)
(PS:内容参考MIT算法导论) 插入排序(Insertion Sort): 适用于数目较少的元素排序 伪代码(Pseudocode): 例子(Example): 符号(notation): 时间复杂 ...
- 经典排序算法 – 插入排序Insertion sort
经典排序算法 – 插入排序Insertion sort 插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕. 插入排序方法分直接插入排序和折半插入排序两种, ...
- [算法] 插入排序 Insertion Sort
插入排序(Insertion Sort)是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,通常采用in-pla ...
- 《算法4》2.1 - 插入排序算法(Insertion Sort), Python实现
排序算法列表电梯: 选择排序算法:详见 Selection Sort 插入排序算法(Insertion Sort):非常适用于小数组和部分排序好的数组,是应用比较多的算法.详见本文 插入排序算法的语言 ...
- 排序算法--插入排序(Insertion Sort)_C#程序实现
排序算法--插入排序(Insertion Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来 ...
- 算法导论(CLRS)答案
算法导论(CLRS)答案 Chapter Section I 1 2 p II 1 2 3 p III 1 2 p IV 1 2 3 4 p V 1 2 3 4 p VI 1 2 3 4 5 p VI ...
随机推荐
- linux平台下Hadoop下载、安装、配置
在这里我使用的linux版本是CentOS 6.4 CentOS-6.4-i386-bin-DVD1.iso 下载地址: http://mirrors.aliyun.com/cen ...
- Vulkan Tutorial 09 图像视图
操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 使用任何的VkImage,包括在交换链或者渲染管线中的,我们都需要创建VkImage ...
- 热部署环境下,dubbo序列化的bug和优化
一.问题的发现与解决 (1) 在热部署下,使用dubbo的序列化一个pojo对象,反序列化时报错:ClassNotFoundException. 最后发现原因是我们的框架选择使用了java序列 ...
- eclipse如何导入项目和文件
在左侧创建项目区,右击鼠标-->选择Import-–>General-> Existing Projects into workPlace-->选择最下方Next-->点 ...
- 关于JQuery获取宽度和高度在chrome和IE下的不同
之前写了一个关于滚动条的东西,可是在写的时候发现JQuery在获取宽度和高度时在不同浏览器中是不一样的,下面发一下代码给给位看官先展示一下: $(function(){ $("#main&q ...
- HttpClient+Jsoup 抓取网页信息(网易贵金属为例)
废话不多说直接讲讲今天要做的事. 利用HttpClient和Jsoup技术抓取网页信息.HttpClient是支持HTTP协议的客户端编程工具包,并且它支持HTTP协议. jsoup 是一款基于 Ja ...
- logging模块
要想使用好logging模块首先要知道它的使用流程: logging类的实例化:logger=logging.getLogger('') 设置logger的级别,logger.setLevel(log ...
- 如何提取Redis中的大KEY
工作中,经常有些Redis实例使用不恰当,或者对业务预估不准确,或者key没有及时进行处理等等原因,导致某些KEY相当大. 那么大Key会带来哪些问题呢? 如果是集群模式下,无法做到负载均衡,导致请求 ...
- vue2.0 配置 选项 属性 方法 事件 ——速查
全局配置 silent 设置日志与警告 optionMergeStrategies 合并策略 devtools 配置是否允许vue-devtools errorHandler 错误 ...
- 东北育才 DAY2组合数取mod (comb)
组合数取模(comb) [问题描述] 计算C(m,n)mod 9901的值 [输入格式] 从文件comb.in中输入数据. 输入的第一行包含两个整数,m和n [输出格式] 输出到文件comb.out中 ...