Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 09.05.2008, 20:25   #1
Никита35
Пользователь
 
Регистрация: 24.04.2008
Сообщений: 24
Восклицание Паскаль.Сортировка массива

Здравствуйте очередной раз.
В задаче следует отсортировать заданный атоматически массив a (0<=i<=n-1) по невозрастанию методом вставок. Количество элементов N вводится с клавиатуры. Диапазон значений массива зависит от N (0<= a[i]<=N-1).
Моя программа:
Program Sortirovka;
uses crt;
const
k=100;
var
i,j:byte;
x,n:integer;
a:array[0..k] of integer;
begin
clrscr;
{Заполнение массива случайными числами}
randomize;
write('Введите кол-во элементов списка*: ');
read(n);
{Задание массива и вывод на экран}
clrscr;
writeln('Исходный массив: ');
for i:=0 to n-1 do
begin
a[i]:=0+random(n-1);
write(a[i],' ');
end;
writeln;
{Сортировка массива вставками}
for i:=1 to n-1 do
begin
x:=a[i];
a[n]:=x;
j:=i;
{Поиск места вставки и сдвиг элемента вправо}
while x>a[j-1] do
begin
a[j]:=a[j-1];
dec(j);
end;
a[j]:=x;
end;
{Вывод отсортированного массива*}
writeln('Массив,отсортированный по невозрастанию: ');
for i:=0 to n-1 do
write(a[i],' ');
repeat until keypressed;
end.

Программа работает почти корректно,только когда вводишь количество элементов "0", она не работает...Преподаватель говорит,нужно сделать сортировку со сторожем, поставьте сторож,пожалуйста,если не сложно...
Никита35 вне форума
Старый 09.05.2008, 20:55   #2
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Программа нормально работает, хотя в ней достаточно "корявостей".
Если количество элементов в массиве будет ноль или 1, то что вы собираетесь сортировать?
Возможно преподаватель предложил сделать "защиту от дурака", чтобы нельзя было ввести n<2?
puporev вне форума
Старый 09.05.2008, 21:03   #3
Никита35
Пользователь
 
Регистрация: 24.04.2008
Сообщений: 24
По умолчанию

хорошо,насчет защиты я понял,но вот сторож поставить всё-равно надо,ну поставьте,пожалуйста...я разберусь
Никита35 вне форума
Старый 09.05.2008, 21:14   #4
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Честно говоря, первый раз слышу про сортировку со сторожем.
puporev вне форума
Старый 09.05.2008, 21:19   #5
Никита35
Пользователь
 
Регистрация: 24.04.2008
Сообщений: 24
По умолчанию

Фу ты!Совсем у меня с этими динамическими списками крыша поехала!))))
Я имел ввиду,что нужно сделать сортировку вставками с поиском без барьера, то есть поставить барьер...))))
Никита35 вне форума
Старый 09.05.2008, 21:49   #6
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Никита, речь вот о чем.
Ваш цикл:

while x>a[j-1] do
begin
a[j]:=a[j-1];
dec(j);
end;

dec(j) может привести к тому, что j выйдет за границы массива. Поэтому должна быть проверка. while j >= 0 ... Но это еще не барьер. Это лишняя проверка в цикле и можно от нее избавиться если сразу найти максимальный элемент (для сортировки по убыванию)
и поменять его с первым. Вот этот элемент и будет барьером. В этом случае проверку можно не делать. И время сортировки уменьшается процентов на 7-10. Только не ждите готового кода. Лучше почитайте Бакнелл. "Фундаментальные алгоритмы и структуры в Delphi".
Ничего, что Delphi, дальше синтаксиса паскаля там не требуется. Автор как раз рассматривает варианты сортировок без барьера, с барьером... В книге и готовый код приводится. Всего несколько строк.
Я бы привел свой, но боюсь Вас запутать. У меня на Delphi, элементы сложной структуры, да еще и сортировка по возрастанию.
-------------------
И еще i, j у Вас byte. Поэтому циклы for i:=0 to n-1 при n=0 не работают. Точнее работают но от 0 до 255. Поменяйте на i, j:integer;
alexBlack вне форума
Старый 10.05.2008, 01:27   #7
Nixielein
 
Аватар для Nixielein
 
Регистрация: 10.05.2008
Сообщений: 2
По умолчанию

может сразу после ввода количества элементов списка сделать проверку? если "н" 0 то запросить ввод еще раз...
Nixielein вне форума
Старый 10.05.2008, 16:14   #8
Никита35
Пользователь
 
Регистрация: 24.04.2008
Сообщений: 24
По умолчанию

Добрый день. Посмотрите,я поставил барьер: Всё правильно?
Код:

Program Sortirovka;
uses crt;
const
k=100;
var
i,j:byte;
x,n:integer;
a:array[0..k] of integer;
begin
clrscr;
{Заполнение массива случайными числами}
randomize;
write('Введите кол-во элементов списка*: ');
read(n);
{Задание массива и вывод на экран}
clrscr;
writeln('Исходный массив: ');
for i:=0 to n-1 do
begin
a[i]:=0+random(n-1);
write(a[i],' ');
end;
writeln;
{Вставка бпрьера;
Для этого находим максимальный элемент и меняем его с первым местами}
max:=a[0];
z:=-1;
for i:=1 to n-1 do
begin
if a[i]>max then
max:=a[i];
z:=z+1;
end;
z:=a[z];
a[z]:=a[0];
a[0]:=a[z];
{Сортировка массива вставками}
for i:=1 to n-1 do
begin
x:=a[i];
a[n]:=x;
j:=i;
{Поиск места вставки и сдвиг элемента вправо}
while x>a[j-1] do
begin
a[j]:=a[j-1];
dec(j);
end;
a[j]:=x;
end;
{Вывод отсортированного массива*}
writeln('Массив,отсортированный по невозрастанию: ');
for i:=0 to n-1 do
write(a[i],' ');
repeat until keypressed;
end.
Никита35 вне форума
Старый 10.05.2008, 18:41   #9
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Никита, когда пишете сообщения, над окном есть кнопочка [#] - вставить тег CODE вокруг выделенного участка. Когда приводите код выделяйте его и нажимайте эту кнопочку. Нам будет проще его читать. Я Вам об этом уже говорил, но Вы или не поняли, или не читаете сообщений.

Смотрим пост #6. Абзац "И еще i, j у Вас byte...." Почему Вы не исправили ?

Приведенный Вами пример не компилируется.

Ваш комментарий: "Для этого находим максимальный элемент и меняем его с первым местами" не соответствует тому, что написано ниже:
Код:
 max:=a[0];
 z:=-1;
 for i:=1 to n-1 do begin
     if a[i]>max then max:=a[i];
     z:=z+1;
 end;
 z:=a[z];
 a[z]:=a[0];
 a[0]:=a[z];
Это место у Вас неправильно.

Учитесь думать и работать самостоятельно. Почитайте, наконец книжку.

Последний раз редактировалось alexBlack; 10.05.2008 в 18:45.
alexBlack вне форума
Старый 11.05.2008, 13:52   #10
Никита35
Пользователь
 
Регистрация: 24.04.2008
Сообщений: 24
По умолчанию

Я вчера весь вечер убил только на то,чтобы сделать эту сортировку-и безрезультатно...Если бы мне прислали алгоритм,я бы обязательно разобрался с ним и сдал...А ведь ещё нужно разбить на подпрограммы...
Помогите,пожалуйста(((
Никита35 вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка массива С/С++ Dagget Помощь студентам 1 16.07.2008 12:18
Сортировка массива Kraven Общие вопросы Delphi 3 25.06.2008 18:22
Сортировка массива...? Roberto Помощь студентам 2 11.04.2008 13:32
Сортировка массива RIO Помощь студентам 1 05.04.2008 17:39
Сортировка массива vitalik007 Общие вопросы Delphi 2 22.09.2007 20:04