C ++数组排序我

时间:2009-11-13 05:07:23

标签: c++ arrays sorting

坚持使用阵列分拣机。必须从最大到最小的数字排序。我正在尝试两个循环(一个嵌套在另一个循环中)。这是代码:

int counter=0; // inner counter
int counter2=0; // outer counter
int sparky[14]; //array set to 14 just to simplify things
int holder; // holds the highest value
int high; //stores the position where it found the value holder

while (counter2 < howmany)
 {
  holder= sparky[counter];
  while (counter <= howmany)
   {
    counter++;
    if (sparky[counter] > holder)
     {
      holder= sparky[counter];
      high= counter; 
     }
   }
   counter2++;
   counter=counter2;
   sparky[high]= sparky[counter-1];
   sparky[counter-1]=holder;
 }

ARRAY UNSORTED:

data[ 0] = 9
data[ 1] = 8
data[ 2] = 7
data[ 3] = 15
data[ 4] = 14
data[ 5] = 3
data[ 6] = 2
data[ 7] = 1
data[ 8] = 10
data[ 9] = 6
data[10] = 5
data[11] = 4
data[12] = 13
data[13] = 12
data[14] = 11

由于代码而排列的阵列:

data[ 0] = 15
data[ 1] = 14
data[ 2] = 13
data[ 3] = 12
data[ 4] = 11
data[ 5] = 11
data[ 6] = 10
data[ 7] = 9
data[ 8] = 8
data[ 9] = 7
data[10] = 6
data[11] = 5
data[12] = 4
data[13] = 3
data[14] = 2

正如您所看到的,11在“已排序”代码中出现两次。虽然我输入这个,但我想知道“高”的价值是否与它有关。

4 个答案:

答案 0 :(得分:5)

除非是家庭作业,否则你可以尝试:

std::sort(A, A + N, std::greater<int>());

答案 1 :(得分:5)

首先要做的事情:

int sparky[14];

会为您提供14个元素的数组sparky[0..13] 15个元素,如您所想。

其次,你的内循环不太正确。你从索引1开始并进入索引15,而因为C数组从零开始,你应该从0循环到14。

您可以通过将循环条件更改为while (counter < howmany)并将counter++移动到内循环结束之前来解决此问题。

  

为了澄清这一点,你实际上在0开始循环但是,因为你在使用counter++之前在循环中做的第一件事是sparky[counter],你'处理从索引1开始的元素。并且,在循环的最后一次运行中,counter == howmany(根据此处的其他注释为14),将其增加到15并使用它,这超出了结束数组。

     

并且,只是为了澄清澄清:-),如果你将howmany设置为14(即,比数组元素的数量少一个),你的循环正确,因为,正如你指出的那样在其他地方的注释中,您在进入内部循环之前加载元素零。我认为,无论何时设置high仍然需要设置holder。如果没有这样做,我会在我的列表中得到两个6和两个2,而没有3或4。

     

作为评论的一个附带问题howmany设置为14,我建议变量名应该回应他们的意图。你在数组中明显有15个元素(索引0到14包括在内)。不要把它作为批评,我只是想帮忙。

第三,(最后,我认为),您没有在设置high的每个时间设置holder - 这些应该保持同步算法正常工作。

请告诉我们这是否是家庭作业。如果没有,我会发布我的解决方案。如果是这样,你应该从这个和其他答案给出的指导原则中解决。你应该知道,如果它是家庭作业并且你使用在互联网上的公共论坛上发布的解决方案(例如这个),你几乎当然因抄袭而失败。不要误以为你的教育工作者不会检查那种东西。

最重要的是,虽然我很乐意发布我的解决方案,但您可能不应该将其用作课堂作业。最重要的是,至少先给它一个镜头。大多数家庭作业寻求者似乎只带着规格来到这里: - )

更新:由于您发布了以下内容:

  

很抱歉提及,但这是课程额外学分项目的一部分。

我猜这是课堂作业。所以,没有汤给你:-)不过,上面的三点应该足以让你解决它。如果您对此有任何具体问题,请随时在此答案的评论中提问。

祝你好运。

答案 2 :(得分:0)

是的,确实......

看看你在哪里使用holder = sparky [counter];和火花[高] =闪耀[反-1]

如果您阅读了代码,您会看到当为最后一个值设置值时,counter-1和sparky [high]是相同的。这将发生在所有值上,但您只在最后一个值上注意到它

尝试在那里添加一些调试代码来说'我正在将这个值移到这个地方'来向你展示你实际在做什么......它可能会有所帮助:)

答案 3 :(得分:0)

试试这个:

int counter=0; // inner counter 
int counter2=0; // outer counter 
int sparky[14] = {14,13,12,11,10,9,8,7,6,5,4,3,2,1}; //array set to 14 just to simplify things 
int holder; // holds the highest value 
int FoundIndex; //stores the position where it found the value holder
int temp; 
bool Found; 
while (counter2 < howmany) 
 { 
  holder= sparky[counter];
  Found = false; 
  while (counter <= howmany && !Found) 
   { 

        if (sparky[counter] >= holder) 
         { 
              holder= sparky[counter]; 
              FoundIndex= counter; 
              Found = true; 
         }
         counter++; 
   } 
   counter2++; 
   counter=counter2;
   temp = sparky[FoundIndex]; 
   sparky[FoundIndex]= sparky[counter-1]; 
   sparky[counter-1]=temp; 
 }

基本上我只修复了你的内循环和交换。但如果你不理解它,就不要使用它。你犯的错误是非常微不足道的,所以我觉得发布代码供你使用感觉很舒服...基本的想法是,如果你使用这种排序(没有双关语),你的索引最终会非常小心。处理两个计数器时,请确保跟踪它们并为它们提供有意义的变量名称。柜台和柜台2都不太好。尝试类似outerCounter和innerCounter的东西。此外,高已更改为FoundIndex。

请记住,跟踪代码(只输出可变值的代码)对于解决这类问题非常有价值......只需输入'cout&lt;&lt;计数器&lt;&lt; ENDL;表明它已经超过阵列的末尾了......