算法导论(第三版)Exercises2.3(归并排序、二分查找、计算集合中是否有和为X的2个元素)
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个元素)的更多相关文章
- 算法导论(第三版)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 ...
- 算法导论(第三版)Problems2(归并插入排序、数列逆序计算)
讨论内容不说明,仅提供相应的程序. 2.1:归并插入排序θ(nlgn) void mergeInsertionSort(int a[], int l, int r, int k) { int m; & ...
- 计算机图形学 opengl版本 第三版------胡事民 第四章 图形学中的向量工具
计算机图形学 opengl版本 第三版------胡事民 第四章 图形学中的向量工具 一 基础 1:向量分析和变换 两个工具 可以设计出各种几何对象 点和向量基于坐标系定义 拇指指向z轴正 ...
- 算法导论-散列表(Hash Table)-大量数据快速查找算法
目录 引言 直接寻址 散列寻址 散列函数 除法散列 乘法散列 全域散列 完全散列 碰撞处理方法 链表法 开放寻址法 线性探查 二次探查 双重散列 随机散列 再散列问题 完整源码(C++) 参考资料 内 ...
- 算法导论 第三章 and 第四章
第三章 渐进的基本O().... 常用函数 % 和 // 转换 斯特林近似公式 斐波那契数 第四章 分治策略:分解(递归)--解决(递归触底)--合并 求解递归式的3种方法: 1:代入法(替代法): ...
- Effective Java 第三版——54. 返回空的数组或集合不要返回null
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
- php小算法总结一(数组重排,进制转换,二分查找)
1.两个有序数组组合成一个新的有序数组 <?php $arr1=array(2,5,7,9,12); $arr2=array(3,4,6,8,10,11); function merge_sor ...
- java 面向对象(三十三):泛型二 泛型在集合中的使用
1. 在集合中使用泛型之前的例子 @Test public void test1(){ ArrayList list = new ArrayList(); //需求:存放学生的成绩 list.add( ...
- 算法导论--最小生成树(Kruskal和Prim算法)
转载出处:勿在浮沙筑高台http://blog.csdn.net/luoshixian099/article/details/51908175 关于图的几个概念定义: 连通图:在无向图中,若任意两个顶 ...
随机推荐
- 学做酷炫有爱的免费网页,学习 Github Page 教你分分钟搭建自己的博客
Github Page 网页搭建教程,教你分分钟搭建自己的博客 很多其它美丽的网页搭建教程教程.请看这里:http://www.duobei.com/course/8506331668 waterma ...
- linux下负载均衡(LVS安装与配置)【转】
一.LVS的三种包转发方式 LVS提供了三种包转发方式:NAT(网络地址映射).IP Tunneling(IP隧道).Direct Routing(直接路由) 不同的转发模式决定了不 ...
- poj 3182 The Grove
The Grove Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 641 Accepted: 297 Descripti ...
- C# winform 加载网页 模拟键盘输入自动接入访问网络
声明: 本文原创,首发于博客园 http://www.cnblogs.com/EasyInvoice/p/6070563.html 转载请注明出处. 背景: 由于所在办公室网络限制,笔者每天都使用网络 ...
- linux删除或隐藏命令历史记录history
1.环境变量添加HISTCONTROL = ignorespace 在命令前面插入空格,这条命令会被 shell 忽略,也就意味着它不会出现在历史记录中.但是这种方法有个前提,只有在你的环境变量 HI ...
- Shell基本的命令
ubuntu 中文乱码 如果使用的是 PuTTY,可以通过修改 font, character set 设置来解决. Window -> Appearance -> Font settin ...
- C#委托和事件本质
C#中委托和事件是很重要的组成部分,而掌握委托和事件的本质将必不可少.为了能探秘本质,写了如下代码 using System; using System.Collections.Generic; us ...
- Lesson 3: The Amazing New Mobile Web
Lesson 3: The Amazing New Mobile Web Article 1: This is Responsive by Brad Frost 各种响应式网站设计的资源. Artic ...
- Java下载Servlet Demo
request.setCharacterEncoding("utf-8"); String name=request.getParameter("name"); ...
- poj2236 基础并查集
题目链接:http://poj.org/problem?id=2236 题目大意:城市网络由n台电脑组成,因地震全部瘫痪,现在进行修复,规定距离小于等于d的电脑修复之后是可以直接相连 进行若干操作,O ...