需要解释在C ++中从高到低反转数组

时间:2014-06-20 04:31:48

标签: c++

我是C ++的初学者,可能是一个非常基本的问题,但我不明白这一点。我有一个数组{10,20,30,40,50,60,70,80,90,100};我想像{100,90,80,70,60,50,40,30,20,10}那样打印出来。我也有以下代码:

#include <iostream>

using namespace std;

int main()
{

  int ara[] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
  int i, j, temp;
  for(i = 0, j = 9; i < 10 && i<j; i++, j--) {
    temp = ara[j];
    ara[j] = ara[i];
    ara[i] = temp;

  }


  for(i = 0; i < 10; i++) {
    cout<<ara[i]<<endl;
  }
  return 0;
}

但我不确定为什么我在下面的行中使用&& i<j。如果我不使用它,那么我的数组输出就像{10,20,30,40,50,60,70,80,90,100}; 我想要一个明确的解释,以便我能理解。

for(i = 0, j = 9; i < 10 && i<j; i++, j--) {

3 个答案:

答案 0 :(得分:4)

你正在这样做的方式,你基本上是用数组中的最后一个元素交换数组中的第一个元素,并在数组中间向它们方向前进。

像数组一样: 1,2,3,4,5

第一次迭代将交换1和5.第二次迭代将交换2和4.第三次迭代不会交换任何内容。

此时您的数组将如下所示:

5,4,3,2,1

在第三次迭代中,i = j。

如果你没有i&lt; j条件,for循环将继续迭代。

第四次迭代将再次交换4和2。第五次迭代将再次交换5和1。因此,您的数组将成为:

1,2,3,4,5再次。

所以i&lt; j条件对于反转上升数组至关重要。 i&lt; 10部分是多余的。

旁注:

使用std :: sort

可能要容易得多

答案 1 :(得分:2)

似乎算法只是简单地从外部切换元素。这就是发生的事情:

{10, 20, 30, 40, 50, 60, 70, 80, 90, 100} -> {**100**, 20, 30, 40, 50, 60, 70, 80, 90, **10**}

{**100**, 20, 30, 40, 50, 60, 70, 80, 90, **10**} -> {**100**, **90**, 30, 40, 50, 60, 70, 80, **20**, **10**}

等等。

然而,一旦到达中心就需要停止;否则,它会在i = 5和j = 4之后翻转。

  • (i = 5,j = 4){100,90,80,70,60,50,40,30,20,10}

如果在此之后继续,它将再次切换元素5和4,从而产生......

{100,90,80,70,**50**,**60**,40,30,20,10}

现在的方式,你只需要i&lt; j条件是正确排序这个。

请注意,这不是真正的排序机制,因为排序机制基于数组的顺序,而不是其内容。真正的排序算法基于高 - &gt;排列数组的元素。低,低 - &gt;高,或其他一些不正常的规则。这个算法简单地翻转了数组的顺序。

答案 2 :(得分:1)

你可以使用std :: sort进行排序。你要做的事情叫做倒车..