【问题标题】:custom sorting function with struct带有结构的自定义排序功能
【发布时间】:2014-05-22 15:17:04
【问题描述】:

所以,我对这个排序函数有一个问题,我写它来排序结构。

我最初的想法是有一个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);
}

【问题讨论】:

  • 您是否在硬编码对象的数量?不要。
  • 你可以把`while(change!=false)`写成while(change == true)。这更具可读性。而change 没有初始化,所以默认值为false
  • @RakibulHasan while( change )
  • @Rakibul Hasan 未初始化变量的默认值未定义。特别是 Visual Studio 喜欢在 Debug 模式下使用 0xcdcd...cd 初始化堆栈变量,这会导致更改为真
  • 啊,是的,忘了初始化更改,我在搞乱这个函数,我把它初始化了一部分,我在发布之前删除了,因为它对我没有任何作用。

标签: c++ c sorting struct


【解决方案1】:

i=0 将在 for 循环中的增量运行之前发生,因此该语句的效果将是下一个循环中的 i==1。获得预期行为的最简单方法是在交换元素后从 for 循环中使用 break(别担心,它只会破坏 for 循环,而不是 while 循环)。您还应该在 while 循环的顶部设置 change=false,而不是在您交换元素时设置它。

【讨论】:

  • @user3665674:但是,您必须注意,在交换后中断通常会导致性能下降...为避免,只需在循环中插入另一个布尔值 bool temp=false;,替换任何由temp 出现change,并在循环结束时设置change=temp(请参阅下面我的答案的编辑)。但我想效率不是你关心的问题,否则你不会拒绝&lt;algorithm&gt;
【解决方案2】:

使用此代码代替排序(尚未测试):

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

【讨论】:

  • Quoth OP:“我知道我可以使用 ,但我应该为此编写自己的函数。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
相关资源
最近更新 更多