C ++ Array Sort - проблема с учётом "bbba" и "0001" как неправильных сортировок - PullRequest
0 голосов
/ 03 марта 2019
 //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-array-sorted-not-iterative-recursive/

Этот код представляет собой функцию большего размера, которая превращает строки и целые числа без знака в массивы и проверяет, является ли порядокэлементы ASCII упорядочены от низшего к высшему.

Проблема в том, что он не рассматривает "abba" или "111110" как неупорядоченные случаи.для таких случаев он постоянно возвращается, и я не понимаю почему.Разве код не сравнивает элемент за элементом с одним рядом с ним?

Ответы [ 3 ]

0 голосов
/ 03 марта 2019

Тестирование на 0 и 1 - хорошая идея в рекурсивном случае.Эта функция может быть вызвана рекурсивно, так что вы можете оставить это.Вы исключили рекурсию и использовали цикл for.Вот исправленный код, который ожидает, пока после цикла 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.

}
0 голосов
/ 03 марта 2019

из вашего кода, вам нужно вернуть хотя бы один из них, а затем вернуть true, когда все в порядке.

** также нужно запускать только до (длина -1)

for (int i=0; i<len-1; i++)
{
      if ( sArr[i] > sArr[i+1])
      {
        return false;
        cout<<"notOrdered"<<endl;
      }
}
cout<<"isOrdered"<<endl;
return true;
0 голосов
/ 03 марта 2019

Вам не нужно проверять на 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...