使用struct的自定义排序功能

时间:2014-05-22 15:17:04

标签: c++ c sorting struct

所以,我对这个排序函数有问题,我写的是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);
}

2 个答案:

答案 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完成的。