|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу. Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста". Название темы слишком короткое или не отражает сути вашего вопроса. Тема исчерпала себя, помните, один вопрос - одна тема Прочитайте правила и заново правильно создайте тему. |
|
Опции темы | Поиск в этой теме |
09.05.2008, 20:25 | #1 |
Пользователь
Регистрация: 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", она не работает...Преподаватель говорит,нужно сделать сортировку со сторожем, поставьте сторож,пожалуйста,если не сложно... |
09.05.2008, 20:55 | #2 |
Старожил
Регистрация: 13.10.2007
Сообщений: 2,740
|
Программа нормально работает, хотя в ней достаточно "корявостей".
Если количество элементов в массиве будет ноль или 1, то что вы собираетесь сортировать? Возможно преподаватель предложил сделать "защиту от дурака", чтобы нельзя было ввести n<2? |
09.05.2008, 21:03 | #3 |
Пользователь
Регистрация: 24.04.2008
Сообщений: 24
|
хорошо,насчет защиты я понял,но вот сторож поставить всё-равно надо,ну поставьте,пожалуйста...я разберусь
|
09.05.2008, 21:14 | #4 |
Старожил
Регистрация: 13.10.2007
Сообщений: 2,740
|
Честно говоря, первый раз слышу про сортировку со сторожем.
|
09.05.2008, 21:19 | #5 |
Пользователь
Регистрация: 24.04.2008
Сообщений: 24
|
Фу ты!Совсем у меня с этими динамическими списками крыша поехала!))))
Я имел ввиду,что нужно сделать сортировку вставками с поиском без барьера, то есть поставить барьер...)))) |
09.05.2008, 21:49 | #6 |
Участник клуба
Регистрация: 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; |
10.05.2008, 01:27 | #7 |
Регистрация: 10.05.2008
Сообщений: 2
|
может сразу после ввода количества элементов списка сделать проверку? если "н" 0 то запросить ввод еще раз...
|
10.05.2008, 16:14 | #8 |
Пользователь
Регистрация: 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. |
10.05.2008, 18:41 | #9 |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
Никита, когда пишете сообщения, над окном есть кнопочка [#] - вставить тег CODE вокруг выделенного участка. Когда приводите код выделяйте его и нажимайте эту кнопочку. Нам будет проще его читать. Я Вам об этом уже говорил, но Вы или не поняли, или не читаете сообщений.
Смотрим пост #6. Абзац "И еще i, j у Вас byte...." Почему Вы не исправили ? Приведенный Вами пример не компилируется. Ваш комментарий: "Для этого находим максимальный элемент и меняем его с первым местами" не соответствует тому, что написано ниже: Код:
Учитесь думать и работать самостоятельно. Почитайте, наконец книжку. Последний раз редактировалось alexBlack; 10.05.2008 в 18:45. |
11.05.2008, 13:52 | #10 |
Пользователь
Регистрация: 24.04.2008
Сообщений: 24
|
Я вчера весь вечер убил только на то,чтобы сделать эту сортировку-и безрезультатно...Если бы мне прислали алгоритм,я бы обязательно разобрался с ним и сдал...А ведь ещё нужно разбить на подпрограммы...
Помогите,пожалуйста((( |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Сортировка массива С/С++ | 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 |