【问题标题】:C++ recursive string mergesortC++ 递归字符串归并排序
【发布时间】:2014-02-04 05:54:03
【问题描述】:

这是一个家庭作业问题,所以虽然我想要可用的代码,但我真正寻求的是如何解决这个问题的见解。我有两个按升序排列的数组,我需要在递归函数中组合它们。看来我需要建立归并排序算法的排序部分。要求是递归函数只能将两个排序后的字符串作为参数,不能使用全局变量或静态变量。

我认为伪代码是:

  • 如果两个字符串的大小 == 0 则返回结果字符串。
  • 比较每个字符串的 substr(0,1) 以查看哪个较小,并将其附加到结果字符串
  • 递归调用函数,新参数是附加字符串的子字符串

我的问题是:如果我不能使用静态变量,如何保存结果字符串?我已经看到将字符串定义为递归调用的 return 语句的代码。在这种情况下会起作用吗?

第二个问题是如何递增函数。我需要在第一次迭代后调用 substr(1,size-1) ,然后在不使用静态变量的情况下增加它。

这是我尝试用静态变量(不允许)求解方程:

static string result="";
static int vv=0;
static int ww=0;

if(v.size()==0 && w.size()==0)
    return result;
if(w.size()==0 || v.substr(0,1) <= w.substr(0,1)){ 
    result+=v.substr(0,1);
    vv++;
    return spliceSortedStrings( v.substr(vv,v.size()-vv) , w); 
    }
else if(v.size()==0 || w.substr(0,1) > v.substr(0,1)){
    result+=w.substr(0,1);
    ww++;
    return spliceSortedStrings( v , w.substr(ww,w.size()-ww));
    }

我会很感激任何指导。

【问题讨论】:

  • 很抱歉,我错过了一些东西。这个练习的重点是获取两个排序字符的字符串,然后递归地将它们合并到一个字符串中,结果也被排序?而且无论这是否是目标,当您只关心front()(假设!empty() 已被验证)时,重复的substr() 调用都是疯狂的。 substr() 昂贵,因为每个都会生成一个新分配的独立字符串。
  • 是的,这些都是练习的要求。
  • 好的。如果您认为有帮助,我会发布一些内容,尽管您似乎已经有了喜欢的答案。
  • user1734710 的回答很有帮助。
  • 我同意,这就是我投赞成票的原因。

标签: c++ string recursion mergesort


【解决方案1】:

这个怎么样:

std::string merge(std::string a, std::string b) {
    if (a.size() == 0) return b;
    if (b.size() == 0) return a;

    if (a.back() < b.back()) {
        std::string m = merge(a, b.substr(0, b.size()-1));
        return m + b.back();
    }
    else {
        std::string m = merge(a.substr(0, a.size()-1), b);
        return m + a.back();
    }
}

正确性和终止性应该是显而易见的,我认为它应该符合给定的约束条件。但我想知道哪位老师会在 C++ 中提出这样的任务,因为上面的代码几乎是低效的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 2014-08-12
    • 1970-01-01
    • 2016-04-14
    • 2015-06-17
    相关资源
    最近更新 更多