算法导论(第三版)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 关于图的几个概念定义: 连通图:在无向图中,若任意两个顶 ...
随机推荐
- Arduino 数码管LED屏驱动
今天測试数码管LED屏驱动,用某产品的一个共阴极的LED屏,依据电路图做数码管LED屏的检測. 代码写得有些冗长,有好几种驱动的方法,这里仅仅是当中一种最直接的方案,抽出时间要做个更有效率的调用和驱动 ...
- 从零开始写一个Tomcat(贰)--建立动态服务器
上文书说道如何通过http协议建立一个静态的服务器来访问静态网页,但我们选择tomcat最主要的原因还是因为它能动态的执行servlet,这边文章将引导你实现一个能够运行servlet的服务器,这个简 ...
- Java基础知识强化93:算一下你来到这个世界多少天的案例
1. 分析: (1)键盘录入你的出生年月日 (2)把该字符串转换为一个日期 (3)通过该日期得到一个毫秒值 (4)获取当前时间的毫秒值 (5)用(4)-(3)得到一个毫秒值 (6)把E的毫秒值转换为天 ...
- JVM内存回收对象及引用分析
自动垃圾回收是Java相较于C++的一个重要的特点,想了解JVM的垃圾回收机制,首先我们要知道垃圾回收是回收什么地方的垃圾,我在我的上一篇博客<JVM内存区域划分>里面有写到JVM里面的内 ...
- Linux下查看显示器输出状态以及修改显示器工作模式(复制 or 扩展)
//关闭显示器VGA1xrandr --output VGA1 --off //开启显示器VGA1xrandr --output VGA1 --auto //关闭显示器LVDS1xrandr --ou ...
- C:应用于字符串处理函数
出于对C的不够熟悉,在读代码的过程中,平凡出现的字符串处理函数,成为了一个理解代码的大问题. 为了更方便的读取和理解代码,特意将接触到的字符串处理函数列出,方便查询: 1.strstr(str1,st ...
- NYOJ-569最大公约数之和
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=569 此题目可以用筛选法的思想来做,但是用到一个欧拉函数 gcd(1,12)=1,gcd( ...
- JavaScript中几个可以转化为false的值
1.[0,NaN,“”,null,undefined]都可以直接转化为false,但这几个值不是完全相等的 var arr = [0,"",false,null,undefined ...
- jQuery Easy UI (适应屏幕分辨率大小)布局(Layout)
一.jQuery Easy UI (适应屏幕分辨率大小)布局(Layout) 1.首先应用的是jquery-easyui-1.4 版本(版本不同,兼容性不同) 2.实现整个页面的布局( layout: ...
- Python 中 open()文件操作的方式
Python的open方法用来打开一个文件.第一个参数是文件的位置和文件名,第二个参数是读写模式: f=open('/1.txt','w') 读写模式的类型有: rU 或 Ua 以读方式打开, 同时提 ...