Re: Перевірка впорядкованості елементів одновимірного масиву
скільки варіантів упорядкування може бути взагалі?
У межах заданої задачі, чи взагалі в межах усіх можливих задач?
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → C++ → Перевірка впорядкованості елементів одновимірного масиву
скільки варіантів упорядкування може бути взагалі?
У межах заданої задачі, чи взагалі в межах усіх можливих задач?
Слухайте, не збивайте людину. В умові чітко сказано: "Відповідь сформулювати: «Yes >>» – якщо масив є упорядкованим за зростанням, «Yes <<» – якщо масив є упорядкованим
за спаданням або «No»."
3 варіанти. ТРИ. Ніяких за незростанням і періодичних не треба виявляти.
Раджу завести 2 булеві змінні
bool can_be_sorted_up = true;
bool can_be_sorted_down = true;
Далі в циклі порівнюємо кожен елемент із попереднім і змінюємо на false ту змінну, яка описує ситуацію, що відпала:
if(x[i-1]<=x[i])
can_be_sorted_down = false;
Ну а в кінці - перевіряєте, якщо одна зі змінних true, то виводите відповідне повідомлення, якщо ж обидві false - тоді No.
Це складно?
3 варіанти. ТРИ
якесь божевілля... то п'ять, то три. це тир, чи шо? чи ви 2 на 2 помножити не вмієте?
Це як у тому анкедоті?
Лише у нас могли вирішення простої задачки розтягнути на 6 сторінок обговорень
90% з яких це просто вода.
koala написав:3 варіанти. ТРИ
якесь божевілля... то п'ять, то три. це тир, чи шо? чи ви 2 на 2 помножити не вмієте?
Де я писав про 5? Ви наркоман бачите, що в гілці, крім вас та автора, ще є люди? Ви бачите, кому відповідаєте?
90% з яких це просто вода.
Як і ваш допис.
Akos_Bond, дивіться, в чому проблема з вашою змінною t: по-перше, її назва не дозволяє зрозуміти, що саме вона містить (а містить вона ознаку того, яка це послідовність - у вигляді так само незрозумілих чисел 1,2,3); а по-друге, якщо ми використовуємо одну змінну, то нам складно розібратися, що саме відбувається, бо, як я вже писав раніше, у нас можливі ситуації (масив з 1 елементу), коли масив відсортований І за зростанням, І за спаданням, тобто нам доводиться перебирати всі можливі комбінації в залежності від поточної ситуації (що у вас у коді й відбувається, хоч це й можна спростити). Коли є 2 змінні - одна відстежує, чи відсортована переглянута частина масиву за зростанням, а друга - за спаданням, то все стає значно простіше.
Слухайте, не збивайте людину. В умові чітко сказано: "Відповідь сформулювати: «Yes >>» – якщо масив є упорядкованим за зростанням, «Yes <<» – якщо масив є упорядкованим
за спаданням або «No»."
3 варіанти. ТРИ. Ніяких за незростанням і періодичних не треба виявляти.
Раджу завести 2 булеві змінніbool can_be_sorted_up = true; bool can_be_sorted_down = true;
Далі в циклі порівнюємо кожен елемент із попереднім і змінюємо на false ту змінну, яка описує ситуацію, що відпала:
if(x[i-1]<=x[i]) can_be_sorted_down = false;
Ну а в кінці - перевіряєте, якщо одна зі змінних true, то виводите відповідне повідомлення, якщо ж обидві false - тоді No.
Це складно?
Насправді проблемою є недовизначеність умови: що робити з повторюваними елементами? Наприклад, масив 1 1 2 є неспадним, але чи можна назвати його впорядкованим за зростанням (і, якщо ні, чи можливо його впорядкувати за зростанням по-справжньому? Тільки виключивши повторювані елементи — більш ніяк). На практиці, проте, під «зростанням» часто розуміють неспадання, і в випадку, коли елементи не повторюються, різниця між цими поняттями зникає. Було б, звичайно, добре, якби в умові було сказано, що елементи вхідного масиву не повторюються, або зростання визначалось як неспадання — проте, прямим текстом цього не сказано. Як і не сказано, що масив має містити щонайменше два елементи (інакше послідовність з 1 елемента чи порожня послідовність є в однаковій мірі і впорядкованою, і невпорядкованою).
У випадку, коли вхідний масив не міститиме зростаючих чи спадаючих пар (довжина менше 2, або всі елементи рівні), змінні, що вказують на зростання і спадання, по завершенню перевірки обидві будуть true. Що, фактично, є четвертим випадком. Чи слід такий масив вважати невпорядкованим? Навіть якщо після завершення роботи два true виводитимуть той же результат, що й два false, протягом перевірки різниця між ними зберігається (вже хоча б тому, що початково вони обидві true).
масив 1 1 2 є неспадним, але чи можна назвати його впорядкованим за зростанням
так
Насправді проблемою є недовизначеність умови: що робити з повторюваними елементами? Наприклад, масив 1 1 2 є неспадним, але чи можна назвати його впорядкованим за зростанням
Ні, це зветься "впорядкований за неспаданням".
послідовність з 1 елемента чи порожня послідовність є в однаковій мірі і впорядкованою, і невпорядкованою
Ні, з міркувань узагальнення така послідовність є впорядкованою. У невпорядкованій послідовності можна переставити елементи і зробити її впорядкованою; послідовність з 1 елемента є вже впорядкованою.
по завершенню перевірки обидві будуть true. Що, фактично, є четвертим випадком. Чи слід такий масив вважати невпорядкованим?
Ні, його слід вважати впорядкованим в усіх чотирьох сенсах. Так само, як масив з однакових елементів є впорядкованим і за незростанням, і за неспаданням.
якщо за не спаданням і за зростанням це є не одне й те ж, то яким чином допоможуть дві змінні?.. ви там визначитеся вже, що й коли ви маєте на увазі...
якщо за не спаданням і за зростанням це є не одне й те ж, то яким чином допоможуть дві змінні?.. ви там визначитеся вже, що й коли ви маєте на увазі...
Я визначився і написав чіткі визначення. Якщо до вас щось не доходить - то цитуйте конкретні слова і речення, значення яких ви не розумієте.
та я вже усе написав, для себе
це ж не я тут шкідливі поради роздаю
Ні, це зветься "впорядкований за неспаданням".
Тобто, в контексті даної задачі (де визначається впорядкованість лише за зростанням та за спаданням) його слід вважати невпорядкованим? А проте,
У невпорядкованій послідовності можна переставити елементи і зробити її впорядкованою;
Послідовність 1 1 2 жодними перестановками неможливо перетворити на послідовність, де кожен елемент, крім першого, більший за попередній. Щоб ця умова виконувалась, елементи слід не лише переставити, а й виключити зайві. Проте, не всі алгоритми сортування передбачають можливість виключення елементів — якщо відсортувати бульбашковим сортуванням такий масив за зростанням, то яким має бути правильний результат?
Відповідь сформулювати:
«Yes >>» – якщо масив є упорядкованим за зростанням,
«Yes <<» – якщо масив є упорядкованим за спаданням або
«No».".
#include <stdbool.h>
#include <stdio.h>
bool asc (int const l, int const r) { return l <= r; }
bool desc(int const l, int const r) { return l >= r; }
bool is_ordered(
int const *const arr, int const size,
bool (*order)(int const, int const)
);
int main(void) {
int size = 3;
int *arr = malloc(size * sizeof(int));
// init
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
// ~
bool ascend = is_ordered(arr, size, asc );
bool descend = is_ordered(arr, size, desc);
free(arr);
if(ascend ) printf("Yes >> \r\n");
if(descend) printf("Yes << \r\n");
if(!ascend && !descend) printf("No \r\n");
return 0;
}
bool is_ordered(
int const *const arr, int const size,
bool (*order)(int const, int const)
) {
for(int i = 1; i < size; ++i)
if(!order(arr[i - 1], arr[i]))
return false;
return true;
}
Build: 1 succeeded, 0 failed