2.3-1:

3 9 26 38 41 49 52 59

3 26 41 52   9 38 49 57

3 41   52 26   38 57   9 49

3   41  52  26  38  57  9  49

2.3-2:(归并排序)

void mergeSort(int a[], int l, int r)
{
int m;
if(l < r)
{
m = (l + r) / ;
mergeSort(a, l, m);
mergeSort(a, m+, r);
merge(a, l, r, m);
}
} void merge(int a[], int l, int r, int p)
{
int i, j, k;
int n1 = p - l + ;
int n2 = r - p;
int lArray[n1], rArray[n2]; for(i=; i<n1; i++) lArray[i] = a[l+i];
for(j=; j<n2; j++) rArray[j] = a[p+j+];
i = ;
j = ;
for(k=l; k<=r; k++)
{
if(i < n1 && (j >= n2 || lArray[i] <= rArray[j]))
{
a[k] = lArray[i];
++i;
}
else if(j < n2 && (i >= n1 || rArray[j] < lArray[i]))
{
a[k] = rArray[j];
++j;
}
}
}

2.3-3:

n=2:  Tn=2lg2=2

假设 n=k时等式成立

Tk+1=2(Tk) + 2k+1=2 * (2k * k) + 2k+1=2k+1(k+1)

2.3-4:

最差情况:

1   n=2;

Tn = Tn-1+n-1;

2.3-5:(二分查找)

int binarySearch(int a[], int v, int n)
{
int l, r, m; l = ;
r = n - ;
while(l <= r)
{
m = (l + r) / ;
if(v < a[m]) r = m - ;
else if(v > a[m]) l = m + ;
else return m;
}
return -;
}

最差情况:

2   n=2;

Tn=T(n/2) + 1      n=2k;

θ(lgn)

2.3-6:

无法降低运行时间

2.3-7:(参考了网友的答案,做了一点优化,希望大家能提更好的改进建议)

算法:求一个N个数的集合是否含有和为X的2个元素(需要支持c99标准)

bool sumX(int a[], int n, int x)
{
int length, complement[n];
mergeSort(a, , n-);
length = deduplication(a, n);
xComplement(a, complement, length, x);
return mergeSearch(a, complement, length);
} bool mergeSearch(int a[], int b[], int n)
{
int i, j;
for(i=, j=n-; i<n && j>= && a[i]!=b[j]; )
if(a[i] < b[j]) i++;
else j--;
return i<n && j>=;
} void xComplement(int a[], int aComplement[], int n, int x)
{
int i;
for(i=; i<n; i++) aComplement[i] = x - a[i];
} int deduplication(int a[], int n)
{
int i, tmp[n];
int j = ;
for(i=; i<n; i++)
{
if(i > && a[i-] != a[i]) j++;
tmp[j] = a[i];
}
for(i=; i<=j; i++) a[i] = tmp[i];
return j+;
} void mergeSort(int a[], int l, int r)
{
int m;
if(l < r)
{
m = (l + r) / ;
mergeSort(a, l, m);
mergeSort(a, m+, r);
merge(a, l, r, m);
}
} void merge(int a[], int l, int r, int m)
{
int max = ;
int i, j, k;
int n1 = m - l + ;
int n2 = r - m;
int lArray[n1+], rArray[n2+]; for(i=; i<n1; i++) lArray[i] = a[l+i];
for(j=; j<n2; j++) rArray[j] = a[m+j+];
lArray[n1] = max;
rArray[n2] = max;
i = ;
j = ;
for(k=l; k<=r; k++)
{
if(i < n1 && lArray[i] <= rArray[j])
{
a[k] = lArray[i];
++i;
}
else
{
a[k] = rArray[j];
++j;
}
}
}

θ(nlgn)

算法导论(第三版)Exercises2.3(归并排序、二分查找、计算集合中是否有和为X的2个元素)的更多相关文章

  1. 算法导论(第三版)Exercises2.1(插入排序、线性查找、N位大数相加)

    关于练习程序的说明参见置顶的那篇. 2.1-1: 31 41 59 26 41 58 31 41 59 26 41 58 31 41 59 26 41 58 26 31 41 59 41 58 26 ...

  2. 算法导论(第三版)Problems2(归并插入排序、数列逆序计算)

    讨论内容不说明,仅提供相应的程序. 2.1:归并插入排序θ(nlgn) void mergeInsertionSort(int a[], int l, int r, int k) { int m; & ...

  3. 计算机图形学 opengl版本 第三版------胡事民 第四章 图形学中的向量工具

    计算机图形学 opengl版本 第三版------胡事民 第四章  图形学中的向量工具 一   基础 1:向量分析和变换   两个工具  可以设计出各种几何对象 点和向量基于坐标系定义 拇指指向z轴正 ...

  4. 算法导论-散列表(Hash Table)-大量数据快速查找算法

    目录 引言 直接寻址 散列寻址 散列函数 除法散列 乘法散列 全域散列 完全散列 碰撞处理方法 链表法 开放寻址法 线性探查 二次探查 双重散列 随机散列 再散列问题 完整源码(C++) 参考资料 内 ...

  5. 算法导论 第三章 and 第四章

    第三章 渐进的基本O().... 常用函数 % 和  // 转换 斯特林近似公式 斐波那契数 第四章 分治策略:分解(递归)--解决(递归触底)--合并 求解递归式的3种方法: 1:代入法(替代法): ...

  6. Effective Java 第三版——54. 返回空的数组或集合不要返回null

    Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...

  7. php小算法总结一(数组重排,进制转换,二分查找)

    1.两个有序数组组合成一个新的有序数组 <?php $arr1=array(2,5,7,9,12); $arr2=array(3,4,6,8,10,11); function merge_sor ...

  8. java 面向对象(三十三):泛型二 泛型在集合中的使用

    1. 在集合中使用泛型之前的例子 @Test public void test1(){ ArrayList list = new ArrayList(); //需求:存放学生的成绩 list.add( ...

  9. 算法导论--最小生成树(Kruskal和Prim算法)

    转载出处:勿在浮沙筑高台http://blog.csdn.net/luoshixian099/article/details/51908175 关于图的几个概念定义: 连通图:在无向图中,若任意两个顶 ...

随机推荐

  1. Linux系统最小化安装之后的系统基础环境安装以及内核优化脚本

    #!/bin/bash #添加epel和rpmforge的外部yum扩展源 cd /usr/local/src wget http://mirrors.ustc.edu.cn/fedora/epel/ ...

  2. solr和mongodb比较

    solr非常灵活,虽然mongodb添加索引查询速度比较快,但是solr查询比mongodb更加灵活,所以需要获取mongodb的oplog,实时将oplog中的数据推送到solr中 oplog A  ...

  3. asp.net微信开发第六篇----高级群发(文本)

    说到高级群发,微信的参考资料http://mp.weixin.qq.com/wiki/14/0c53fac3bdec3906aaa36987b91d64ea.html 首先我们先来讲解一下群发文本信息 ...

  4. HTTP状态码(HTTP Status codes)简介

    HTTP可能大家都熟悉,就是超文本传输协议.浏览器通过HTTP与WEB Server通讯(也有一些其它软件比如IM使用HTTP协议传递数据),把我们的请求(HTTP Request)传递给服务器,服务 ...

  5. adb服务启动失败处理命令

    执行以下命令: D:\android-sdks\platform-tools>adb kill-server --停止adb服务 D:\android-sdks\platform-tools&g ...

  6. 如何搭建DHCP及DHCP中继服务器

    当局域网中有大量的主机时,如果逐台设置ip地址.默认网关.dns服务器地址时等网络参数,显然是一个费力也未必讨好的方法,这时使用DHCP的方式分发ip地址,能够动态配置各客户机的网络地址参数,大大减轻 ...

  7. nexus 的使用及maven的配置

    一.nexus的安装 1.下载nexus(点解这里) 2.下载后解压文件,将解压后的nexus文件放在你自己想要的地方 3.配置环境变量(和配置java的环境变量一样) 4.安装和启动nexus 由于 ...

  8. 1202.2——Xcode部分快捷键

    Ctrl+N(Next)  光标跳到下一行 Ctrl+P(Previous)   光标跳到上一行 Ctrl+B(Back) 光标向左边移动一个字符 Ctrl+F(Forward)   光标向右边移动一 ...

  9. js的相关验证

    1 var JavaScriptCommon = { /*身份证号码校验*/ VerifyID: function (socialNo) { if (socialNo == "") ...

  10. Linux下Fork与Exec使用

    Linux下Fork与Exec使用   一.引言 对于没有接触过Unix/Linux操作系统的人来说,fork是最难理解的概念之一:它执行一次却返回两个值.fork函数是Unix系统最杰出的成就之一, ...