Вычисление длины максимально неубывающей последовательности в массиве
Дан одномерный массив arrX(100) As Integer. Необходимо определить длину максимальной последовательности элементов, отсортированных по возрастанию. (Если весь массив отсортирован, то результат будет 101).
"длина максимальной последовательности элементов, отсортированных по возрастанию", пожалуйста.
Предположим, идут массив заполнен следующими числами: 2 3 5 7 9 11, 6 8 9 10 15, 5, 4 14 16 20 22, 3 4 и т. д. получается, что тут длина максимальной последовательности элементов будет 6
Код:
#include <cstdio>
int main() {
//массив:
int a[] = {2, 3, 5, 7, 9, 11, 6, 8, 9, 10, 15, 5, 4, 14, 16, 20, 22, 3, 4};
//длина массива:
int len = sizeof(a)/sizeof(a[0]);
//счетчики:
int cnt = 1, cnt_max = 0;
//цикл:
for(int i = 0; i < len - 1; i++)
{
if(a[i+1] > a[i]) //если след.> текущего., то:
{
cnt = cnt + 1;
}
else //иначе:
{
if (cnt > cnt_max) cnt_max = cnt;
cnt = 1;
}
}
//вывод результата:
printf("%dn", cnt_max);
return 0;
}
int main() {
//массив:
int a[] = {2, 3, 5, 7, 9, 11, 6, 8, 9, 10, 15, 5, 4, 14, 16, 20, 22, 3, 4};
//длина массива:
int len = sizeof(a)/sizeof(a[0]);
//счетчики:
int cnt = 1, cnt_max = 0;
//цикл:
for(int i = 0; i < len - 1; i++)
{
if(a[i+1] > a[i]) //если след.> текущего., то:
{
cnt = cnt + 1;
}
else //иначе:
{
if (cnt > cnt_max) cnt_max = cnt;
cnt = 1;
}
}
//вывод результата:
printf("%dn", cnt_max);
return 0;
}
числа я привела просто для примера, на самом деле они могут быть любыми..
//длина массива:
int len = sizeof(a)/sizeof(a[0]); - не очень поняла с этой записью....
в visual basic у меня что-то такое вышло:
Public Function MaxLength(ByVal arrX() As Integer) As Integer
Dim IntS As Integer 'счетчик цикла
Dim intMax As Integer 'наибольшая последовательность
Dim intC As Integer 'количество последовательных элементов
intC = 1
IntMax = 0
For intS = 0 To 100
If arrX(IntS) > arrX(IntS + 1) Then
intC += intC
ElseIf intC > intMax Then
intMax = intC
End If
Next
Return intMax
End Function
Но что-то я сомневаюсь, что это верно=))
Возможно не очень понятный момент в моем else.
Код:
else //иначе:
{
if (cnt > cnt_max) cnt_max = cnt; //самостоятельный if
cnt = 1;//эта строка отдельная в else, не продолжение if из строки выше
}
{
if (cnt > cnt_max) cnt_max = cnt; //самостоятельный if
cnt = 1;//эта строка отдельная в else, не продолжение if из строки выше
}
числа я привела просто для примера, на самом деле они могут быть любыми..
//длина массива:
int len = sizeof(a)/sizeof(a[0]); - не очень поняла с этой записью....
//длина массива:
int len = sizeof(a)/sizeof(a[0]); - не очень поняла с этой записью....
Такая запись в C++ и определяет длину массива. Массив можно поменять, длина автоматически пересчитается. Пример мой не зависит от конкретного массива, просто взял для иллюстрации приведенный вами.
Похоже у вас есть ошибка с выходом за границы массива в этом месте:
Код:
For intS = 0 To 100
If arrX(IntS) > arrX(IntS + 1) Then
If arrX(IntS) > arrX(IntS + 1) Then
Поскольку ваш массив состоит из 101 элемента и индексируется от нуля (я правильно понял?), то надо писать цикл от 0 до 99 включительно.
И еще: правильное такое условие: arrX(IntS) < arrX(IntS + 1), а у вас обратный знак.. Это для возрастающей последовательности, а для неубывающей <= (так и не понял, в вопросе неубывающая, в пояснении возрастающая. Это немного разные вещи).
еще один маленький вопрос: зачем возвращать в единицу intC после intMax=intC?
Потому, что для каждой очередной последовательности счет должен начинаться заново.
или обязательно надо повторять в цикле?
Разумеется надо.