| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Алгоритмы > Два наименьших и два наибольших элемента |
| Автор: Guest 7.7.2005, 13:56 |
| Как найти два наименьших и два наибольших элемента из десяти данных элементов. |
| Автор: ~FoX~ 7.7.2005, 14:01 |
| определяем 4-е переменных, при проходе заносим в них первые 4-е элемента, дальше проверям на большее/меньшее и переоопределям при надобности...... |
| Автор: Akina 7.7.2005, 14:02 |
| Отсортировать по величине, взять 2 первых и 2 последних... |
| Автор: SoWa 7.7.2005, 17:19 |
| Ну да! Методом сортировки, выбора или полного перебора. |
| Автор: Guest 7.7.2005, 17:37 | ||
Попробовал завести четыре переменных, всё равно че то не робит... А можно пример на паскале |
| Автор: Akina 7.7.2005, 17:51 | ||
можно... в разделе "Центр помощи". PS. А заодно можно зарегистрироваться - это совершенно бесплатно и даже не больно... |
| Автор: vadims 7.7.2005, 18:42 |
| Выложи код как бы бы искал одно максимальное/минимальное число в массиве - попробую подталкнуть в нужном напралении Или сортировку массива |
| Автор: Guest 7.7.2005, 19:19 | ||||
Вообще то с массивом я знаю как-это просто, нужно без массива и использовать "однопроходной" алгоритм .... Вот код:
Так находится наименьший и наибольший элементы min и max. |
| Автор: vadims 7.7.2005, 19:56 |
| Если это можешь - в чем тогда проблема ??? Только паскаль подзабыл и могут быть синтаксические ошибки, например так (но можно конечно и красоту понаводить) uses crt; const count_d=10; var d,i:Integer; array min[0..1]:Integer; //тут не помню точно синтаксис array max[0..1]:Integer; // но 2 массива по 2 числа типа int begin Clrscr; Write('Введите 10 целочисленных элементов:'); Read(d); min[0]:=d; min[1]:= d; max[0]:=d; max[1]:=d; for i:=2 to count_d do begin Read(d); if (d<min[0]) then begin min[1]:=min[0]; min[0]:=d; end; else begin if (d<min[1]) then min[1]:=d; end; if (d>max[0]) then begin max[1]:=max[0]; max[0]:=d; end; else begin if (d>max[1]) then max[1]:=d; end; end; WriteLn('Min:',min[0]); WriteLn('Min:',min[1]); WriteLn('Max:',max[0]); WriteLn('Max:',max[1]); Readkey; end. |
| Автор: Guest 8.7.2005, 07:59 | ||
| vadims, на мысль ты меня натолкнул... Только условия пришлось немного подправить, вот так будет правильно:
Огромное тебе спасибо, что навёл на мысль |
| Автор: vadims 8.7.2005, 08:57 | ||
Излишества на мой взгляд |
| Автор: Guest 8.7.2005, 09:41 | ||||||||||
А помоему нет, если написать так:
И задать последовательность:1 2 3 ... 7 8 9 10, то min[0] и min[1] будут равны 1. И ещё, если оставить вот так:
И задать последовательность:6 5 1 2 3 1 7 8 9 10, то min[0] и min[1], тоже будут равны 1. Поэтому:
Короче говоря проверил на все виды последовательностей, и попытался предусмотреть любую из них. |
| Автор: Akina 8.7.2005, 10:09 | ||||
вообще коли integer, то начать бы с
и потом только считывание и сравнение.
не излишество, а ошибка. Если второе введенное число будет самым большим (или самым маленьким) - сбойнет. |
| Автор: vadims 8.7.2005, 10:19 | ||
Согласен что мой выбор первых max/min значений некорректен, но и твой последний вариант как и сказал Akina тоже ошибка - проше всего вернуться к твоему изначальному
хотя возможны и другие варианты |
| Автор: Alex101 8.7.2005, 11:17 | ||
Может так?
Проверьте, у меня компилятора нет. |
| Автор: vadims 8.7.2005, 11:25 |
| Alex101 А что означает конструкция min2:=min1 xor min2 - побитовое или логическое "исключающее или" или что-то другое ??? |
| Автор: Alex101 8.7.2005, 11:28 |
| vadims Побитовое "исключающее ИЛИ". Надо все три строки смотреть - это обмен переменных значениями. |
| Автор: Guest 8.7.2005, 11:29 | ||||||||
И вправду сбой дает... Как ты сказал наверное самый лучший вариант:
Всем кто помогал большущее спасибо |
| Автор: Alex101 8.7.2005, 11:41 | ||
Лучше max[0]:=-maxint-1; max[1]:=-maxint-1; |
| Автор: vadims 8.7.2005, 11:47 |
| Alex101 Обясни пожалуйста - никак не въеду 1. К чему эти операции ??? max1:=min2 xor max1; min2:=min2 xor max1; max1:=min2 xor max1 2. Чем лучше ??? max[0]:=-maxint-1; max[1]:=-maxint-1 |
| Автор: Alex101 8.7.2005, 11:57 | ||
maxint=32767, а maxnegativeint=-32768 |
| Автор: vadims 8.7.2005, 12:01 |
| Alex101 - Максимум это согласен. Кстати, а компилятор не должен отсечь конструкцию -maxint ??? Взгляни на мой предыдущий пост - я его как раз редактировал когда ты отвечал |
| Автор: Akina 8.7.2005, 12:52 | ||
Нет, это просто предопределенная Public Const. Но должно существовать и MinInt - это так, к слову... Добавлено @ 12:54 Кстати. Если это в разделе "Алгоритмы" - почему циклимся на Паскалевом коде? А если нет - то в некоторых языках есть процедура SWAP... |
| Автор: Alex101 8.7.2005, 13:10 | ||||
Меняются местами значения max1 и min2
Все равно мои три строчки будут работать быстрее |
| Автор: vadims 8.7.2005, 13:25 | ||
Еще ведь быстрее будет |
| Автор: Akina 8.7.2005, 13:43 | ||
При чем тут скорость? мы об алгоритме говорим, значит реализация тривиальной функции (а SWAP - именно таковая) рассматриваться просто не должна, ибо оффтоп. |
| Автор: Alex101 8.7.2005, 14:14 | ||||||
Для данной ветки - безусловно, я просто старался оптимальный по скорости алгоритм предложить. Sorry for offtop
Не-а
|