2014-05-22 115 views
0

所以,我有这个排序功能的问题,我写了排序结构。自定义排序功能与结构

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

你是否硬编码对象的数量?别。 – crashmstr

+0

你可以写'while(change!= false)'为'while(change == true)'。这更可读。并且'change'没有被初始化,所以默认值将是'false' – Rakib

+2

@RibibulHasan'while(change)' – clcto

回答

1

i=0会在增量的for循环运行之前发生的权利,所以该语句的效果将是下一个循环i==1。获得预期行为的最简单方法是在交换元素之后从for循环到break(不要担心,它只会打破for循环,而不是while循环)。你也应该只在012循环的顶部设置change=false,而不是设置它,只要你不要交换元素。

+0

谢谢,交换后的分手工作完美。 – user3665674

+0

@ user3665674:然而,你必须意识到,在交换之后发生的断开会导致性能降低......为了避免,只需在循环内部插入另一个布尔型'bool temp = false;',就可以取代任何发生'用'temp'改变',并在循环结束时设置'change = temp'(参见下面我的答案的编辑)。但我想效率不是你关心的问题,否则你不会拒绝''。 – davidhigh

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

+0

OP:“我知道我可以使用,但我应该为此编写自己的功能。” – Sneftel

+0

重读了这个,谢谢指出! – davidhigh