为什么程序无法找到使用数组元素形成的最大数字?

时间:2018-10-13 05:00:40

标签: c++ arrays quicksort

访问https://www.interviewbit.com/problems/largest-number/来解决问题...

现在,我编写了以下代码来解决该问题(尽管我使用数组来存储数字,但稍后将在字符串中进行存储..)-

因此,在该算法中,我基本上使用了快速排序,但有一个转折,我更改了大于或小于两个数字的定义,例如X,Y,使得如果使用X首先,Y其次或XY形成的数字是> = YX然后大于(X,Y)为真

在当前情况下,代码给出了运行时错误,我不明白为什么,而且在注释中所示的一些调试之后,仍然没有按预期来得到答案。

#include <iostream>
#include <vector>
#include <cmath>
#include <stdlib.h>
#include <time.h>
using namespace std ;

bool greaterthan(int a,int b)
{
    int n1,n2,s1,s2;

    n1=((int )log10(a))+1;
    n2=((int)log10(b))+1;



    s1=a*((int )pow(10,n2))+b;
    s2=a + ((int )pow(10,n1))*b;

    if(s1>=s2){return true;}
    else{return false;}
}

int spartitions(vector<int >&B,int s , int e)
{
    int pivot = B[e];
    int pin =s;
    int i;

    for(i=s;i<=e;i++)  //if i change this to i<e 
    {
        if(B[pin]>=pivot)
        {swap(B[pin],B[i]);
        pin++;
        }
                       // and add swap(B[pin],B[e]);
    }
    return pin-1;           // and return pin here  then it works but not give correct output
}


int prand(vector<int >&B,int s ,int e)
{
    srand(time(NULL));
    int n = rand()%(e-s+1)+s;
    swap(B[n],B[e]);
    int pin = spartitions(B,s,e);
    return pin;
}








void qsort(vector<int >&B,int s, int e )
{
 if(s<e){
 int p= prand(B,s,e);
 qsort(B,s,p-1);
 qsort(B,p+1,e);

 }
}

vector<int> largestnumber(vector<int >&A)
{
    int n =A.size();
    vector<int >B(n);
    B=A;

    qsort(B,0,n-1);

    return B;

}


int main()
{
    int n;
    cin>>n;

    vector<int>A(n);

    int i;
    for(i=0;i<n;i++)
    {
        cin>>A[i];
    }

  vector<int >B(n);

  B=largestnumber(A);

  for(i=0;i<n;i++)
  {
      cout<<B[i];
  }


}

请帮助,因为我是编程方面的新手,大约3-4小时后仍无法解决... ??

如果有人只能更正我的代码而不给出其他算法,我将不胜感激,因为我希望对此算法进行更正。

1 个答案:

答案 0 :(得分:0)

您自己编写的qsort函数以递归方式调用自身,这会将更多的内容添加到堆栈中,而堆栈只有这么多的空间。当列表太大时,堆栈中将有太多的函数调用,并且溢出。这就是为什么第一个输入(用于n)小于5的任何东西都可以正常工作的原因,但是一旦超过该值,就会出现运行时错误。考虑不使用递归函数调用。

编辑: 启用优化似乎也可以解决此问题。 这可能不起作用,具体取决于编译器及其优化方式。 (适用于MSVC)