自定义排序功能与结构
所以,我有这个排序功能的问题,我写了排序结构。自定义排序功能与结构
我最初的想法是有一个while
循环,直到没有变化发生了,里面有for
周期,通过一个array[10]
去,比较是彼此相邻的两个元素。如果下一个元素大于前一个元素,则交换它们,并且迭代器回到零。
所有类型的作品,除了第一个元素,不是最高的。从第二到最后,一切都很好。
任何指针,我犯了一个错误?代码似乎对我来说很好... 我知道我可以使用<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);
}
i=0
会在增量的for循环运行之前发生的权利,所以该语句的效果将是下一个循环i==1
。获得预期行为的最简单方法是在交换元素之后从for循环到break
(不要担心,它只会打破for循环,而不是while循环)。你也应该只在012循环的顶部设置change=false
,而不是设置它,只要你不要交换元素。
谢谢,交换后的分手工作完美。 – user3665674
@ user3665674:然而,你必须意识到,在交换之后发生的断开会导致性能降低......为了避免,只需在循环内部插入另一个布尔型'bool temp = false;',就可以取代任何发生'用'temp'改变',并在循环结束时设置'change = temp'(参见下面我的答案的编辑)。但我想效率不是你关心的问题,否则你不会拒绝'
使用该代码,而不是用于分拣(仍未经测试):
#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
完成。
你是否硬编码对象的数量?别。 – crashmstr
你可以写'while(change!= false)'为'while(change == true)'。这更可读。并且'change'没有被初始化,所以默认值将是'false' – Rakib
@RibibulHasan'while(change)' – clcto