如何在c ++中检查二维数组是否按升序排列?

时间:2017-02-05 01:05:45

标签: c++ arrays sorting

尽管我已按升序初始化数组,但我无法使此函数返回true。

bool won(int gameBoard[][SIZE])
{
    for(int i=0;i<SIZE;i++)
    {
        for(int j=0;j<SIZE;j++)
        {
            if(gameBoard[i][j]>gameBoard[i][j+1]||gameBoard[i][j]>gameBoard[i+1][0])
            {
                return false;
            }
        }
    }
    return true;
}

2 个答案:

答案 0 :(得分:5)

您的代码中存在两个问题。

<强> 1。在某个阶段,i和j的值会超出范围。

<强> 2。检查数组是否按升序排序的条件是错误的。

让我们逐一解决

  
      
  1. 要保持i,j的值在范围内,请像这样更改for循环
  2.   

之前:

for(int i=0;i<SIZE;i++)
{
    for(int j=0;j<SIZE;j++)
    {
    }
}

后:

for(int i=0;i<SIZE-1;i++)
{
    for(int j=0;j<SIZE-1;j++)
    {
    }
}

说明:

您的计划遇到的错误是当j的值变为SIZE-1时您正在检查gameBoard[i][j]>gameBoard[i][j+1]。但gameBoard[i][j+1]会尝试访问gameBoard[i][SIZE]并且您知道该索引中没有值,因为您将值从0保存到SIZE-1。 当您的程序检查最后一行时,i会出现同样的问题。

  
      
  1. 要修复检查条件if the array is in ascending order or not,请更改您的条件:
  2.   

之前:

if(gameBoard[i][j]>gameBoard[i][j+1]||gameBoard[i][j]>gameBoard[i+1][0])

后:

if((j!=SIZE-2 && gameBoard[i][j]>gameBoard[i][j+1])
||(j==SIZE-2 && ((gameBoard[i][j]>gameBoard[i][j+1])||(gameBoard[i][j+1]>gameBoard[i+1][0])))

阐释:

j的索引小于SIZE-2时,比较gameBoard[i][j]&amp; gameBoard[i][j+1]并查看它们是否违反了条件。但当j的索引等于SIZE-2时,我们必须比较两件事。一个是比较gameBoard[i][j]下一个元素gameBoard[i][j+1],另一个是将j的下一个元素与下一行第一个元素gameBoard[i+1][0]进行比较。 N:B:只有那时您应该检查gameBoard[i][j]是否大于gameBoard[i+1][0],而不是每次都检查。

答案 1 :(得分:3)

这是一个更安全的版本,不需要进行任何比较或检查包含在每行开头的索引,所有这些都使用std::is_sorted算法函数。

#include <algorithm>

// Assuming that the array is 10 x 10
#define SIZE 10 

bool won(int gameBoard[][SIZE])
{
    return std::is_sorted(&gameBoard[0][0], &gameBoard[SIZE-1][SIZE]);
}

由于2D数组是连续的,因此无需编写循环,因为范围从第一个项目的地址开始到整个2D数组中最后一个项目之后的地址。

Live Example

Live Example showing that the test data is not sorted