C++ 为0';的大输入提供浮点异常的排序函数;s
我已经为此问题编写了一个代码: 给定一个非负整数列表,将它们排列成最大数 例如,给定[3,30,34,5,9],最大形成数为9534330 注意:结果可能非常大,因此需要返回字符串而不是整数 基本上,我在这段代码中试图实现的是,首先对最重要的数字使用基数排序逻辑,并按降序排列。后来我做了第二个最重要的数字等等。我通过传递对向量使用了C++ 为0';的大输入提供浮点异常的排序函数;s,c++,sorting,radix-sort,floating-point-exceptions,C++,Sorting,Radix Sort,Floating Point Exceptions,我已经为此问题编写了一个代码: 给定一个非负整数列表,将它们排列成最大数 例如,给定[3,30,34,5,9],最大形成数为9534330 注意:结果可能非常大,因此需要返回字符串而不是整数 基本上,我在这段代码中试图实现的是,首先对最重要的数字使用基数排序逻辑,并按降序排列。后来我做了第二个最重要的数字等等。我通过传递对向量使用了std::sort()函数,其中对的第一个是值,对的第二个是索引。以下是我的代码: bool radixOrder(pair<int,int> p1, p
std::sort()
函数,其中对的第一个是值,对的第二个是索引。以下是我的代码:
bool radixOrder(pair<int,int> p1, pair<int,int> p2)
{
int val1=p1.first;
int e1=p1.second;
int val2=p2.first;
int e2=p2.second;
if(val1==val2 && e1==e2)
{
return val1==val2;
}
else if(((val1/e1)%10) == ((val2/e2)%10))
{
while(val1/e1 == val2/e2)
{
if(e1/10!=0)
e1=e1/10;
if(e2/10!=0)
e2=e2/10;
}
return (val1/e1)%10 > (val2/e2)%10;
}
else
{
return (val1/e1)%10 > (val2/e2)%10;
}
}
vector<pair<int,int> > createVNew(vector<int>& v)
{
vector<pair<int,int> > temp;
for(int i=0; i<v.size(); i++)
{
cout << i << endl;
int val=v[i], e=1;
if(v[i]==0)
{
temp.push_back(make_pair(val, 1));
}
else
{
while((e/v[i])==0)
e*=10;
if(e!=v[i])
{
temp.push_back(make_pair(val,e/10));
}
else if(e==v[i])
{
temp.push_back(make_pair(val,e));
}
}
}
return temp;
}
string largestNumber(vector<int>& v)
{
int e=1;
vector< pair<int,int> > vnew=createVNew(v);
sort(vnew.begin(), vnew.end(), radixOrder);
stringstream s;
for(int i=0; i<vnew.size(); i++)
{
s<<vnew[i].first;
}
return s.str();
}
bool radixOrder(对p1,对p2)
{
int val1=p1.first;
int e1=p1.2秒;
int val2=p2.first;
int e2=p2.2秒;
if(val1==val2&&e1==e2)
{
返回值val1==val2;
}
如果((val1/e1)%10)==(val2/e2)%10))
{
while(val1/e1==val2/e2)
{
如果(e1/10!=0)
e1=e1/10;
如果(e2/10!=0)
e2=e2/10;
}
返回(val1/e1)%10>(val2/e2)%10;
}
其他的
{
返回(val1/e1)%10>(val2/e2)%10;
}
}
vector createVNew(vector&v)
{
向量温度;
对于(int i=0;i您的radixSort
函数违反了,即不可伸缩性(即,radixOrder(x,x)
必须返回false
,但它返回true
,因为执行转到第一个if
分支)
这里有一个典型的未定义行为的例子,我相信这段代码应该像
if (e1==e2)
{
return val1 > val2;
}
不过,我可以通过将输入的数字按相反顺序排序来解决这个问题。您的radixSort
函数违反了,即不可伸缩性(即,radixOrder(x,x)
必须返回false
,但它返回true
,因为执行转到第一个if
分支)
这里有一个典型的未定义行为的例子,我相信这段代码应该像
if (e1==e2)
{
return val1 > val2;
}
不过,我可以通过将输入的数字按相反顺序排序来解决这个问题。您的radixSort
函数违反了,即不可伸缩性(即,radixOrder(x,x)
必须返回false
,但它返回true
,因为执行转到第一个if
分支)
这里有一个典型的未定义行为的例子,我相信这段代码应该像
if (e1==e2)
{
return val1 > val2;
}
不过,我可以通过将输入的数字按相反顺序排序来解决这个问题。您的radixSort
函数违反了,即不可伸缩性(即,radixOrder(x,x)
必须返回false
,但它返回true
,因为执行转到第一个if
分支)
这里有一个典型的未定义行为的例子,我相信这段代码应该像
if (e1==e2)
{
return val1 > val2;
}
不过,我可以通过将输入的数字按相反顺序排序来解决这个问题。没有登录就无法访问你的链接。在这里发布内容。没有登录就无法访问你的链接。在这里发布内容。没有登录就无法访问你的链接。在这里发布内容。没有登录就无法访问你的链接。在这里发布内容。非常感谢。我还有一个问题,为什么代码只在大输入时崩溃,而不是在小输入时崩溃?还有,这只是出于好奇,但你是如何得出比较器一定是错的结论的?我曾尝试过很多次搜索,但都没有找到。你真是天才@Anton Savin:)@User222321没有问题。要回答为什么在这种特殊情况下,它只在大输入时崩溃,您必须调试到排序实现中。@User222321:std::sort
通常递归工作:要对序列排序,将其分成两组并排序,然后合并两部分。现在看来,这对r小集合。将两个元素的序列拆分为两个元素的两半显然是没有效率的。因此,std::sort
通常针对小集合进行优化,这种优化很可能以不同的方式调用谓词。非常感谢。我还有一个问题,为什么代码只在大输入时崩溃不是更小的吗?还有,这只是出于好奇,但你是如何得出比较器一定是错的结论的?我试着搜索了很多次,但都没有找到。你真是天才@Anton Savin:)@user222321没问题。要回答为什么在这种特殊情况下,只有大输入才会崩溃,你必须调试intosort
实现。@user2223211:std::sort
通常是递归工作的:要对序列进行排序,将其分成两个集合,然后对它们进行排序,然后合并这两个部分。现在发现,这对于小集合来说是无效的。将两个元素的序列分成两个半部,每个元素分成两个半部显然是无效的。因此std::sort
通常是针对小型集合进行优化的,这种优化很可能以不同的方式调用谓词。非常感谢。我还有一个问题,为什么代码只针对大型输入而不是较小的输入崩溃?还有,出于好奇,仅此一个,但您是如何得出比较器μ可能是错了吗?我试着搜索了很多次,但都没有找到。你真是天才@Anton Savin:)@user222321没问题。要回答为什么在这种特殊情况下,只有大输入才会崩溃,你必须调试到sort
实现中。@user2223211:std::sort
通常是递归工作的:对se进行排序中断