所以,我对这个排序函数有问题,我写的是sort struct。
我最初的想法是有一个while
周期,直到没有发生任何变化,并且内部有for
周期通过array[10]
,比较两个旁边的两个元素其他。如果next元素大于前一个元素,则交换它们,并将迭代器抛回零。
除了第一个不是最高的元素外,一切都有效。从倒数到最后,一切都很好。
任何指针,我犯错的地方?代码对我来说似乎很好......
我知道我可以使用<algorithm>
,但我应该为此编写自己的函数。
void izvadaPecRez(Pari masivs[])
{
Pari temp;
bool change;
int i;
while(change!=false)
{
for(i=0;i<10;i++)
{
if(masivs[i+1].kopejais>masivs[i].kopejais)
{
temp=masivs[i];
masivs[i]=masivs[i+1];
masivs[i+1]=temp;
change=true;
i=0;
}
else
{
change=false;
}
}
}
for(i=0;i<10;i++)
printone(masivs, i);
}
答案 0 :(得分:1)
i=0
将在for循环中的增量运行之前发生,因此该语句的效果将是下一循环中的i==1
。获得预期行为的最简单方法是在交换元素后从for循环中仅break
(不用担心,它只会破坏for循环,而不是while循环)。您还应该在while循环的顶部设置change=false
,而不是在不交换元素时设置它。
答案 1 :(得分:0)
使用此代码进行排序(仍未测试):
#include<array>
#include<functional>
#include<algorithm>
std::array<Pari,100> masivs;
auto compare=[](const Pari& a, const Pari& b) {return a.kopejais<b.kopejais;};
std::sort(masivs.begin(), masivs.end(), compare);
此处,使用std::array
而不是普通数组。接下来,定义自定义比较lambda函数并将其传递给std::sort
。
我不知道它是否与您的代码完全相同,但至少会根据条目kopejais
对您的类进行排序。
编辑:以下是您的代码版本,其工作速度应比接受的答案快一些:
void izvadaPecRez(Pari masivs[])
{
bool change=true;
while(change==true)
{
change=false;
for(int i=0;i<10;i++)
{
if(masivs[i+1].kopejais > masivs[i].kopejais)
{
std::swap(masivs[i], masivs[i+1]);
change=true;
}
}
};
for(i=0;i<10;i++)
printone(masivs, i);
}
原因是您没有反复循环遍历已排序的数组部分,这是在交换后使用break
完成的。