Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

(Паскаль) Упорядочевание одномерного массива

26K
07 марта 2008 года
АлексейМ
18 / / 06.12.2007
Добрый вечер уважаемому сайту. Помогите решить задачку.
У меня небольшой вопрос по массиву на Pascal.
Есть массив состоящий из 10 элементов вида: 0 1 1 1 1 0 0 0 0 0
Надо сделать массив: 0 0 0 0 0 0 1 1 1 1 путем того, что единицы переместились по массиву.
276
07 марта 2008 года
Rebbit
1.1K / / 01.08.2005
ИМХО. Довольно странное задание.

Тут смотря как правило формулировать. Можно задаться правилом чтоб все единицы в массиве перенести в его конец, а остальную часть не трогать, можно просто отсортировать масив.
Напиши бульбашку. Помоему она тут будет самой уместной.
26K
07 марта 2008 года
АлексейМ
18 / / 06.12.2007
Нужно просто переместить единицы в конец, сортировка в данном случае не причём.
276
07 марта 2008 года
Rebbit
1.1K / / 01.08.2005
Ну тогда чтото типа такого (псевдокод)
Код:
j := 0;
for i := 0 to arrSize-1 do
begin
  if (arr <> 1) then
  begin
    arr[j] = arr;
    j := j + 1;
  end
end;

for i := j to arrSize-1 do
  arr := 1;


Надеюсь нигде не ошибся. Програмку сам заделаеш.
26K
07 марта 2008 года
АлексейМ
18 / / 06.12.2007
Спасибо, правда всё нормально получается.
26K
08 марта 2008 года
АлексейМ
18 / / 06.12.2007
А если в массиве будет так 2 1 1 1 1 0 0 0 0 0, чтобы массив стал
0 0 0 0 0 2 1 1 1 1 т.е передвигались любые числа кроме нуля в массиве. Как можно это сделать?
И такой вропрос как можно сделать задержку по времени, чтобы показать движение чисел по массиву?
1.9K
10 марта 2008 года
andriano
474 / / 10.01.2008
Цитата: АлексейМ
Нужно просто переместить единицы в конец, сортировка в данном случае не причём.


Это и есть частный случай сортировки. Вероятно, наиболее подходит радиксная. Два прохода по массиву.

276
10 марта 2008 года
Rebbit
1.1K / / 01.08.2005
Цитата: АлексейМ
А если в массиве будет так 2 1 1 1 1 0 0 0 0 0, чтобы массив стал
0 0 0 0 0 2 1 1 1 1 т.е передвигались любые числа кроме нуля в массиве. Как можно это сделать?
И такой вропрос как можно сделать задержку по времени, чтобы показать движение чисел по массиву?


Ты говорил что единицы в конец. Тут получается что нули в начало. Сути дела это не меняет. Делаеш примерно тоже, но идеш с конца в начало и пропускаеш/дописываеш не 1, а 0

Цитата: andriano
Это и есть частный случай сортировки. Вероятно, наиболее подходит радиксная. Два прохода по массиву.


Не знаю про радиксную сортировку, но в даном случае сортировка вообще ни при чем. И достаточно одного прохода. Смотри мой код выше.

1.9K
10 марта 2008 года
andriano
474 / / 10.01.2008
Цитата: Rebbit
Не знаю про радиксную сортировку, но в даном случае сортировка вообще ни при чем. И достаточно одного прохода. Смотри мой код выше.

1. Не "вообще ни при чем", а именно она и есть. Вне зависимости от тогог, что лично ты знаешь, и что - нет.
2. Если проход один, зачем цикла два?

276
10 марта 2008 года
Rebbit
1.1K / / 01.08.2005
Цитата: andriano
1. Не "вообще ни при чем", а именно она и есть. Вне зависимости от тогог, что лично ты знаешь, и что - нет.


Перемещение по масиву и сортировка - разние вещи. Сортировка за О(N) невозможна а тут пожалуйста.

Цитата: andriano
2. Если проход один, зачем цикла два?


Сори, я с утра после праздника плохо соображаю. Подумал про два вложеных цикла. Да за два прохода надо. Хотя именно для этой задачи можно и в одном цикле с двумя индексами.

1.9K
10 марта 2008 года
andriano
474 / / 10.01.2008
Цитата: Rebbit
Перемещение по масиву и сортировка - разние вещи. Сортировка за О(N) невозможна а тут пожалуйста.

А кто сказал, что сортировка за O(N) невозможна?
В общем случае - да, невозможна. А в частном (когда нужно упорядочить множество элементов, принимающих конечное число значений) - запросто.
Судя по первоначальному письму, элементы могут принимать только два значения: 0 и 1. Следовательно, на первом подходе подсчитываем количество тех и других, а на втором - заполняем массив. (как вариант: на первом проходе подсчитываем количества и обнуляем, а на втором - заполняем только единицы в верхней части массива).
Кстати, последнее решение, пожалуй, лучше всего, т.к. не содержит условных переходов (кроме возврата к началу цикла, который хорошо предсказывается процессором), на которых сбивается предсказатель ветвлений, и из-за которых происходят существенные задержки выполнения программы на суперскалярном процессоре.

242
11 марта 2008 года
Оlga
2.2K / / 04.02.2006
[COLOR=Red]Автору нарушение: в Паскаль разрешено задавать вопросы только если есть свои нароботки, а не написание кода с нуля. Также называй нормально темы. Название должно отражать суть вопроса, а не его общую тематику "Задача с одномерным массивом".[/COLOR]
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог