C++数组排序 - 将"bbba"和"0001"视为不正确排序的问题


 //is the array ordered?
    //if there are one or zero elements, inherently sorted
    //can't compare to other elements if they don't exist
    if ( len == 0 || len ==1 )
    {
        return true;
        cout<<"isOrdered"<<endl;
    }
    //if more than 1 element <> can do a comparison
    for (int i=0; i<len; i++)
    {
          if ( sArr[i] > sArr[i+1])
          {
            return false;
            cout<<"notOrdered"<<endl;
          }
          else if (sArr[i]<=sArr[i+1])
            {
              return true; //here it must be ordered.
            }
    }

}

排序逻辑取自:https://www.geeksforgeeks.org/program-check-areck-array-sorted-not-iterative-recursive/

此代码在较大的函数中,该函数将字符串和无符号的INT变成数组,并检查元素的顺序是否是从最低到最高点订购的ASCII。

问题是,它不会将" ABBA"或" 111110"视为未订购的情况。对于这样的案件,它不断返回,我不明白为什么。该代码不是通过元素与元素进行比较吗?

您不需要在开始时测试0或1(因为for循环已经具有i<len条件,并且对于0和1来说都是错误的),但是您确实需要移动 return true脱离循环。在比较所有元素之前,您不知道它是对的:

for(int i=1; i<len; ++i) {
    if(sArr[i-1] > sArr[i]) return false;
}
return true;

从您的代码中,您至少需要返回订单,然后在一切都可以的时候返回true。

**也只需要直到(长度-1)

运行
for (int i=0; i<len-1; i++)
{
      if ( sArr[i] > sArr[i+1])
      {
        cout<<"notOrdered"<<endl;
        return false;
      }
}
cout<<"isOrdered"<<endl;
return true;

在递归情况下,0和1的测试是一个好主意。此功能可以递归地称为,因此您可以忽略它。您已经省略了递归,而是用于循环。这是校正的代码,该代码要等到for循环之后,如果正确排序当前对,则返回true。

#include <iostream>
using namespace std;
bool IsArraySorted(int sArr[], int len)
{
  //is the array ordered?
  //if more than 1 element <> can do a comparison
  for (int i = 0; i < len - 1; i++) {
    if (sArr[i] > sArr[i + 1]) {
      cout << "notOrdered" << endl; // call before return :-)
      return false;
    }
  }
  cout << "Ordered" << endl;
  return true; //here it must be ordered.
}

最新更新