算法导论学习笔记(3)-习题2.3-7-排序+二分

《算法导论》第 7 章 - 快速排序 本文系统讲解了快速排序算法,包括其分治思想、划分操作和性能分析。快速排序通过选择基准元素将数组划分为两部分递归排序,平均时间复杂度为O(nlogn),但最坏情况下可能达到O(n^2)。文章提供了标准快速排序和随机化版本的C++实现,并讨论了优化策略:对于小数组可改用插入排序;对于重复元素可采用三路快速排序。快速排序因其优秀的平均性能和原地排序特性,成为实际应用中最常用的排序算法之一。文章还分析了算法的时间复杂度和空间复杂度,并给出了代码实现示例,帮助读者深入理解这一经典算法。 阅读详情

question(题意):

Describe a O(n lg(n))-time algorithm that, given a set S of n integers and another integer x, determines whether or not there exist two elements in S whose sum is exactly x.

设计一个O(n lg(n))时间复杂度的算法,给定一个n个数字的集合,和一个数字x, 问,是否能在这个集合中找到两个数字,他们的和恰好为x.

Solution(解法):

在一个数组里面找某个数,O(n lg(n)),很容易想到用排序+二分,算法导论刚刚讲了归并排序,正好是O(n lg(n))的排序算法,可是这个题是找两个数的和为x, 那么该如何做呢,我们可以在排序后的数组里面,从小到大一次枚举第一个数(该数字必须满足<=x/2,原因自己想),然后在后面查找是否有另外一个数即可,下面是代码:

Code(代码):

//算法导论 习题2.3-7
#include <iostream>
using namespace std;

void merge(int* A, int p, int q, int r)
{
    int n1 = q - p +1, n2 = r - q;
    int L[n1], R[n2];
    
    for (int i = 0; i < n1; i++) L[i] = A[p+i];
    for (int i = 0; i < n2; i++) R[i] = A[q+i+1];
    int i = 0, j = 0, k = p;
    while (k <= r)
    {
        if (i >= n1) {
            while (j < n2) {
                A[k++] = R[j++];
            }
        }
        else if(j >= n2) {
            while (i < n1) {
                A[k++] = L[i++];
            }
        }
        else if(L[i] <= R[j]) {
            A[k++] = L[i++];
        }
        else {
            A[k++] = R[j++];
        }
    }
}
void merge_sort(int* A, int p, int r)
{
    if (p < r) {
        int q = (p + r) / 2;
        merge_sort(A, p, q);
        merge_sort(A, q+1, r);
        merge(A, p, q, r);
    }
}
bool bSearch(int* A, int L, int R, int v)
{
    while (L <= R)
    {
        int M = (L + R) / 2;
        if (A[M] < v) {
            L = M+1;
        }
        else if (A[M] > v) {
            R = M-1;
        }
        else {
            return true;
        }
    }
    return false;
}
bool Find(int* A, int n, int x)
{
    merge_sort(A, 0, n-1);
    
    for (int i = 0; i < n; i++)
    {
        if (A[i] <= x / 2) {
            if (bSearch(A, i+1, n-1, x-A[i])) {
                return true;
            }
        }
        else {
            return false;
        }
    }
    return false;
}
int main()
{
    int A[10] = {2, 3, 1, 5, 3, 2, 9, 3, 0, 7}, x;
    
    while (cin >> x)
    {
        if (Find(A, 10, x))
        {
            cout << "find two numbers whose sum is " << x << endl;
        }
        else
        {
            cout << "Not find two numbers whose sum is "<< x << endl;
        }
    }
    
    return 0;
}



算法导论第三版 第二章 2.3-7 在csdn 上找了这个答案,  http://download.csdn.net/download/qq329025705/5437915 阅读详情

相关推荐

《算法导论》课后习题全解指南

动态规划是解决多阶段决策过程优化问题的一种数学方法。它将复杂问题分解为更小的子问题,并存储子问题的解,避免重复计算,从而提高效率。在动态规划中,一个复杂的问题通常被分解为一系列子问题,并且子问题的解可以用来构造原问题的解。动态规划解决问题的基本思想是:将待求解的问题分解为若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。使用动态规划解决问题时,通常需要满足两个条件:最优子结构性质和重叠子问题性质。最优子结构意味着问题的最优解包含其子问题的最优解。

weixin_30356433的博客 805

算法导论2.3-7答案

题:一个长度为n的整数集合S,一个整数x,写一个算法,判断S中是否有两数之和等于x,时间复杂度要求O(nlgn) 解答如下: 1.算法思路:先用归并排序法对S进行排序,然后用二分查找法,查找S中有无等于x-S[i]的值 2.伪代码如下: bool CheckSums(S,p,r,x) { S<--sort(S);//用归并排序进行 for(int i=...

weixin_30439131的博客 191

算法导论课后习题2.3-7和思考题2-4答案源码

算法导论课后习题2.3-7合并排序和思考题2-4逆序对答案源码

算法导论 CLRS 2.3-7 2-2

2.3 - 7 其实这道星号题的思路已经在前面几个习题中给了提示。 思路是先用merge sort对数组升序排列,然后进行binary search即可, 时间复杂度为\T(n)=Θ(nlogn+logn)=θ(nlogn)\T(n)=\Theta(n\log{n}+\log{n})=\theta(n\log{n}) 算法分析如下:设二叉搜索下边界为lowlow,上边界为highhigh,中间

LL_zhuo的专栏 925

Unity集成抖音小游戏:从IL2CPP配置到SDK接入全流程解析

本文详细解析了使用Unity开发抖音小游戏的完整流程。从关键的IL2CPP编译后端配置、PlayerSettings设置,到StarkSDK的接入与资源优化(如AutoStreaming),再到激励视频广告、录屏分享等核心功能的代码实现,提供了从环境准备到打包上传的全方位实战指南,帮助开发者高效完成技术适配。

weixin_27943395的博客 690

艾德克斯电子负载IT8510维修

2年前从朋友那收了这台艾德克斯电子负载,收来的时候上面的编码器就不好用,就是旋转的时候一会增加一会减小这种现象,不过其他功能都是正常的,自己也就将就用这。直到昨天,电子负载开机发现空载的时候电压不是0,开始有mV级的跳动,心想这个不正常。又测试了一下恒流功能,已经不能正常工作了。

mainbanp 4651

算法导论 2.3-7 python实现

描述一个运行时间为O(nlogn)的算法

u014479468的专栏 687

零基础微信理财通基金实操指南(2026版)

先活下来:保证不亏大钱,再想赚钱慢慢变富:年化10%,7年翻倍,这已经很好了开始比完美重要:今天先存100元到零钱通,就是最好的开始现在打开微信,进入理财通,完成第一步风险测评吧!有任何问题可以随时问,我会用最通俗的方式解释。

老韩的Linux云计算架构师进阶之路 1688

算法导论 2.3-7 新的查找问题

描述一个运行时间为θ(nlgn)的算法,给定n个整数的集合S和另一个整数x,该算法能确定S中是否存在两个其和刚好为x的元素。 该算法伪代码如下: 该算法的执行过程如下: 首先对数组S进行归并排序 - 或任何运行时间不高于θ(nlgn)的排序。 代码 6~10 行执行这样一个循环:算法将已排序的子数组 S[i..j] 中的最小元素 S[i] 和最大元素 S[j] 的和与x进行比较。 如果比较结果小于x,由于S[i..j]是已排序的,那么可以推断S[i]与S[i..j]中任何其它元素都小于x,故可

madaxin的博客 576

CSP-J第一道模拟题——贪心的小朋友

第一行是一个整数 n,表示糖果的堆数 第二行是由空格分隔的 n 个正整数,即数组 candies,表示每堆糖果的数量。后一个离场的小朋友所拿的糖果总堆数必须小于前一个小朋友(对第一个小朋友没有限制)后一个离场的小朋友所拿的糖果总量必须小于前一个小朋友(对第一个小朋友没有限制)这道题目很简单,但是必须删去无用的部分,看清题目,才能得分哦!输出一行共一个整数,表示最多可能有多少个小朋友吃上了美味的糖果。输出最多可能有多少个小朋友吃上了美味的糖果。离场之后的小朋友才能吃上美味的糖果。每个小朋友可以拿多堆糖果。

weixin_29959235的博客 639

【科研数据获取】根据Excel表个中的企业/公司信息批量获取经纬度坐标,并进行地图可视化

批量获取企业/公司的经纬度坐标,并进行地图可视化1 需求2 实现途径3 需求逐步实现 1 需求 在做项目的时候,老板或者项目答辩时候甲方最喜欢看到的就是可视化结果,尤其是涉及到地图可视化。很多时候会遇到企业/公司的数据,想要做地图可视化,必不可少的就是要获取它们具体地址:第一种就是像查户口一样精准一下具体的城镇街道,还有一种就是经纬度信息,前一种属于文字内容往往用于管理方面,第二种数字信息多用于数据处理与分析。 2 实现途径 获取地理信息数据,自然需要使用到地图的功能,这里直接采用百度地图的拾取坐标系统,

lys_828的博客 2337

算法导论 - 2.3-7 确定集合S中是否存在两个其和刚好为x的元素

描述一个运行时间为O(nlgn)的算法,给定n个整数的集合S和另一个整数x,该算法能确定S中是否存在两个其和刚好为x的元素。 这里给出两种算法,都要求先用归并排序算法(merge sort)把集合S中元素从小到大排好序,这一步运行时间为O(nlgn) 第一种算法比较简单,即对集合S中每一个整数a,利用二分搜索法(Binary Search)在排好序的集合S中搜索(x - a)是否存在,如果存在...

u012439764的博客 1535

实现两端固支梁热力耦合的有限元分析

在本文中,我们将使用Matlab实现两端固支梁的热力耦合有限元分析。我们假设梁的材料是均匀的,梁的截面积为1,长度为1,两端固支,且受到均匀分布的热荷载。接下来,我们需要组装全局刚度矩阵和热传导矩阵。对于两个相邻的元素,它们共享一个节点,因此需要使用连接矩阵将局部矩阵组装成全局矩阵。接下来,我们需要定义元素刚度矩阵和热传导矩阵。然后,我们需要定义载荷向量。然后,我们需要定义边界条件。在这个例子中,梁的两端固支,因此我们需要将两端节点的位移限制为0。最后,我们需要解决线性方程组,得到节点的位移和温度分布。

CyberSparkZ的博客 396

算法导论第三版习题及答案

正在看算法导论第三版,记录自己做的一些习题及答案。

u013668671的博客 1万+

NVIDIA Isaac Sim 入门教程(二)

Omniverse Isaac Sim 的工作空间非常容易自定义。调整用户界面的大小、停靠、取消停靠、添加和移除面板都非常容易。进入顶部菜单栏,单击下拉菜单最下方的窗口 > 视口 > 视口 2(现在工作区中应该会出现一个名为 "视口 2 "的新视口。如果您想创建更多的视口,请按照相机检查器扩展进行操作。单击并拖动视口 2 的顶部标题以激活停靠部件。拖放到原始视口的右侧,将两个视口并排放置。单击并向左拖动视口 2 的左侧,使视口大小相等。

机器人控制与仿真应用 6544

Winform利用动画控制实现各种特效

动画绘制控制类代码 using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.Threading; using System.Windows.Forms; namespace Mengliao.CSharp.A14 { #region 动画类型枚举 // 本例为了简单起见没有使用见名知意的名称,如用于实际可将这些枚举成员更名

LilyCoder的博客 2501

《算法导论》习题5.3-1 ~ 5.3-7

《算法导论》习题 5.3.1 - 5.3.7  5.3-5 带星号我抄了一下题目, 5.3-6 比较有意思我抄了一下题目, 其他的题可以自己对照书(原书第三版). 5.3-1   直接考虑第2次循环前, 第1次循环后第1个位置的元素是原集合1 ~ n中任意一个元素的概率总是 1/n1/n1/n, 所以可以以此为循环不变式的起点而不必使用空集合和0排列。 5.3-2   容易证明该算法一定不会产生恒等排列, 因为第一次循环后第一个元素一定是原排列中2 ~ n中的某个元素。现在证明Kelp教授没有实现均匀随机排

weixin_40085040的博客 627

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

算法导论-7-2 针对有相同元素值的快速排序

题目详见算法导论7-2习题,

u013252593的专栏 6035

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

算法导论4.3习题

算法导论4.3习题4.3-1 证明:T(n) = T(n-1)+n的解为O(n2)O(n^2)O(n2)4.3-2 证明: T(n) = T(⌈\lceil⌈n/2⌉\rceil⌉) + 1的解为O(lg⁡n)O(\lg n)O(lgn)4.3-3 我们看到T(n)=2T(⌊n/2⌋\lfloor n/2 \rfloor⌊n/2⌋) + n 的解为 O(nlg⁡n)O(n\lg n )O(nlgn...

lcyFire的博客 1697

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

算法导论实战(一)(算法导论习题第一到四章)

算法导论的知识点学习将持续性更新在算法启示录_十二月的猫的博客-优快云博客,欢迎大家订阅呀(反正是免费的哦~~)实战篇也将在专栏上持续更新,主要目的是强化对理论的学习(题目来源:山东大学孔凡玉老师推荐)本文到这里就结束啦~~本篇文章的撰写花了本喵三个多小时知识来源:《算法导论》课后习题、山东大学孔凡玉老师ppt。不要用于商业用途转发哦~%28n&plus;c&plus;

十二月的猫 1140

算法导论作业2.3

2.3-1 3,9,26,28,41,49,52,573,26,41,529,38,49,573,4126,5238,579,4934152263857949 2.3-2 MERGE(A,p,q,r) n1=q-p+1 n2=r-q let L[1..n1+1] and R[1..n2+1] be new arrarys for i=1 to n1 L[i]=A[p+i-1] for j=1 t...

fugitive1的博客 367

学习笔记——《算法导论》第2章习题

前言:这个月开始拜读《算法导论》,难度挺大的,在这里记录一下课后习题的思路和代码实现。2-1:在归并排序中对小数组用插入排序分析:在多小的小数组时采用插入排序呢?归并排序的最坏时间复杂度和平均时间复杂度都是 nlogn插入排序的最坏时间复杂度为 n(n-1)/2, 平均时间复杂度为 n(n-1)/4所以另 nlogn = n(n-1)/2  -- &lt;1&gt;nlogn = n(n-1)/4...

LinJingchun的博客 607

《算法导论》习题2.2-2答案

作者在本书官网上给出的算法为: SELECTION-SORT(A) n = A.length for j = 1 to n - 1 smallest = j for i = j + 1 to n if A[i] < A[smallest] smallest = i exchange A[j] with A[smallest]...

fhl_jz的博客 1002

《算法导论》第三版第7章 快速排序 练习&思考题 个人答案

7.1 快速排序的描述 7.1-1 解: 13, 19, 9, 5, 12, 8, 7, 4, 21, 2, 6, 11 9, 19, 13, 5, 12, 8, 7, 4, 21, 2, 6, 11 9, 5, 13, 19, 12, 8, 7, 4, 21, 2, 6, 11 9, 5, 8, 19, 12, 13, 7, 4, 21, 2, 6, 11 9, 5, 8, 7, 12, 13,...

张劲声的博客 1853

算法导论(第三版)第一章习题答案

算法导论(第三版)第一章习题答案 这个专栏主要是将算法学习过程中使用的《算法导论》一书的练习题的答案进行汇总,有一部分习题答案可能是我自己做的或者是从网上搜集的,难免会存在错误的地方,希望能得到大家的指正。因为这是初次接触算法,所以后续的章节更新会比较慢,并且可能会出现很多我做不出来的题目,但是会我尽量坚持下去,每天看两页书。码字不易,如果对你有用希望能点个赞,如果有问题欢迎在评论区讨论。 1.1 算法 1-1 生活中需要排序的例子有很多,比如名次,成绩,身高统计等等。 凸壳问题: 令S为平面上的一个点集

越今朝的博客 1519

算法导论第三版2.3答案

这个就是枚举第一个加数是哪个,然后根据大小关系选择在左右的其中一个部分进行二分查找。这题有点不太明白,感觉书上讲的有点问题,二分优化的插入排序虽然确定插入位置只要。二分的代码不好写,瞎写了一个也不知道对不对,反正思路是这么个思路~每次都把搜索范围减去一半,故为。

游者的博客 896
上一篇: 算法导论学习笔记(2)-归并排序
下一篇: 算法导论学习笔记(4)-3种方法求最大连续子串
吃掉吃掉
博客等级 码龄12年 7粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值