Перейти к содержанию
СофтФорум - всё о компьютерах и не только

Сортировка чисел в массиве


Рекомендуемые сообщения

Короче, по информатике задали написать сортировку чисел в массиве. Наваял вот что:

program sortirovka;uses crt;varA: array[0..9] of integer;i, temp: integer;begin   clrscr;   WriteLN('Введите 10 чисел: ');   for i:=0 to 9 dobegin    Read(A[i]);    If A[i] > A[i+1] then begin     temp:=A[i];     A[i]:=A[i+1];     A[i+1]:=temp; end;end;   Writeln('Упорядочено: ');   for i:=0 to 9 doWrite(A[i], ' ');   readkey;end.

Но эта ерунда не работает :)

Помогите, плз.

Ссылка на комментарий
Поделиться на другие сайты

Сортировко не надо делать во време ввода масива а после как его ввели. Да ти же пробуеш сравнят последний елемент, которий польвател написал, со следуещим, которий еще не соществуеть.

И по методу, по которий ти начал делат ето, тебе надо масив обхождат много раз.Что небуть такое:

program sortirovka;uses crt;varA: array[0..9] of integer;i, temp: integer;begin  clrscr;  WriteLN('Введите 10 чисел: ');  for i:=0 to 9 do  Readln(A[i]); for j=0 to 9 do  for i:=0 to 9 do   begin   If A[i] > A[i+1] thenbegin    temp:=A[i];    A[i]:=A[i+1];    A[i+1]:=temp;end;end;end;  Writeln('Упорядочено: ');  for i:=0 to 9 doWrite(A[i], ' ');  readkey;end.
Ссылка на комментарий
Поделиться на другие сайты

Да ти же пробуеш сравнят последний елемент, которий польвател написал, со следуещим, которий еще не соществуеть.

и это самая главная ошибка.

Если массив небольшой - лучше сортировать методом пузырька.

например:

program sortirovka;

uses crt;

var

A: array[0..9] of integer;

i, j, temp: integer;

begin clrscr;

WriteLN('Введите 10 чисел: ');

for i:=0 to 9 do

  Readln(A);

for i:=0 to 9 do

for j:=i to 9 do

  begin

  If A[j] > A[j+1] then

    begin

    temp:=A[j];

    A[j]:=A[j+1];

    A[j+1]:=temp;

    end;

  end;

end;

Writeln('Упорядочено: ');

for i:=0 to 9 do

  Write(A, ' ');

readkey;

end.

насчет правильности синтаксиса - не уверена, давно на паскале не писала.

Удачи.

Ссылка на комментарий
Поделиться на другие сайты

Вот что я написал:

program sortirovka;uses crt;varA: array[1..10] of integer;i,j, t: integer;begin   clrscr;   WriteLN('Введите 10 чисел: ');   for i:=1 to 10 doRead(A[i]);   For i:=1 to 10 do      for j:=i to 10 do  if A[j] > A[j+1] then      begin   t:=A[j];   A[j]:=A[j+1];   A[j+1]:=t;      end;   Writeln('Упорядочено: ');   for i:=1 to 10 doWrite(A[i], ' ');   readkey;end.

Но что-то он не сортирует как надо... ;)

Ссылка на комментарий
Поделиться на другие сайты

Второй цикл по i вообще выкинь...

И правильнее делать так:

n:=10;

for j:=1 to n do

begin

if A[j] > A[j+1] then

begin

t:=A[j];

A[j]:=A[j+1];

A[j+1]:=t;

end;

n:=n-1;

end;

Ссылка на комментарий
Поделиться на другие сайты

gvozd

Код Darhazer близок к правильному, но писался, видимо, второпях, есть заметные неточности вроде несоответствия количества begin количеству end, да и вообще end'ы там Darhazer щедрой рукой разбрасывал, но это уже мелочи, компилятор подскажет ошибку, главное, от истины недалеко... Хуже, что во всех программах из этого топика произойдет выход индекса элемента за границы массива. Тоже надо подкорректировать. А вложенность циклов все же нужна, поскольку за один проход внутреннего цикла пузырек в худшем случае всплывает только на одну ступень, так что надо повторить внутренний цикл хотя бы n-1 раз. Да и внутренний цикл должен быть по числу сравнений, а не элементов, тоже на 1 меньше. В программировании такую ошибку называют "ошибкой счета столбов": промежутков между столбами на 1 меньше, чем самих столбов.

В общем, так:

program sortirovka;

uses crt;

var

A: array[1..10] of integer;

i, temp: integer;

begin

clrscr;

WriteLN ('Введите 10 чисел: ');

for i:=1 to 10 do Readln (A);

for j=1 to 9 do

for i:=1 to 9 do

If A > A[i+1] then

begin temp:=A; A:=A[i+1]; A[i+1]:=temp; end;

for i:=1 to 10 do Write (A, ' ');

WriteLN; readkey;

end.

Тоже не проверял. Ну, попытка не пытка.

Можно еще немного усовершенствовать программу по Kuzmich, заменив в заголовке внутреннего цикла 9 на j. Немного меньше понятности, но время выполнения вдвое короче. Правда, на 10 элементах много времени в любом случае не уйдет.

Ссылка на комментарий
Поделиться на другие сайты

All

Ничего не работает, работает только если ввожу что-то типа 2 1 3 4 5 6 7 8 9 10, а если вразброс, то получаю что-то типа: 1 1 1 1 1 1 1 0 0 10. :sm(100):

Ссылка на комментарий
Поделиться на другие сайты

program sortirovka;

uses crt;

var

A: array[1..10] of integer;

i,t,r: integer;

begin

clrscr;

WriteLN ('Введите 10 чисел: ');

for i:=1 to 10 do Readln (A);

n:=9;

repeat

r:=1;

for j:=1 to n do

if A[j] > A[j+1] then

begin

t:=A[j];

A[j]:=A[j+1];

A[j+1]:=t;

r:=0;

end;

n:=n-1;

until r=1;

for i:=1 to 10 do Write (A, ' ');

WriteLN; readkey;

end.

Ссылка на комментарий
Поделиться на другие сайты

вот попробуй метод простого выбора...вроде так называется....по моему самый простой в написании...но не самый лучший.....вроде как метод слияние быстрее(меньше раз цикл обрабатывается) но его щас писать влом.....

const n=10;

type mas=array[1..n] of integer;

var a:mas; i,j,k:integer;

begin

randomize;

for i:=1 to n do

begin

a:=random(10);

write(a:3);

end;

writeln;

for j:=1 to n do

for i:=1 to n do

If A > A[i+1] then

begin

k:=a;

a:=a[i+1];

a[i+1]:=k;

end;

for i:=1 to n do Write (a:3);

writeln;

readln;

end.

Ссылка на комментарий
Поделиться на другие сайты

gvozd

Попробовал я установить на свою Windows XP SP2 с NTFS Turbo Pascal 5.5 и прогнать свою программку. Как ни странно, Pascal спокойно установился, модуль CRT прямого управления дисплеем, правда, работать отказался, но он мне и не слишком был нужен, я просто убрал относящиеся к нему команды clrscr и readkey.

По моему тексту программы компилятор выдал мне две синтаксические ошибки: не объявлена переменная j и в заголовке цикла по j забыто двоеточие в присваивании.

После корректировки программа запустилась и нормально отработала несколько тестовых примеров.

Не знаю, в чем у тебя было дело, может, при вводе текста у тебя была где-то ошибка?

Ссылка на комментарий
Поделиться на другие сайты

Не знаю, может это еще будет полезно :1eye:

Program Zamena;{Программа сортирует элементы массива методом замены}Uses Crt;{ Подключение стандартного модуля для вызова стандартной процедуры очистки экрана и установки курсора в левый верхний угол окна}constcount=20;mas: array[1..20] of byte=(12,10,25,96,47,61,3,54,23,51,64,79,43,2,8,47,32,34,74,5);varMin,i,j,k: integer;a: byte;begin ClrScr;     writeln('Выведем на экран неотсортированные элементы массива:');     for i:=1 to count  do         write(' ',mas[i]);         writeln;         for i:=1 to count do             for j:=i+1 to count do                 while mas[i]<mas[j] do                       begin                            k:=mas[i];                            mas[i]:=mas[j];                            mas[j]:=k;                        end;     writeln;     write('Массив отсортирован по убыванию методом замены: ');     writeln;    for min:=1 to count do     write(' ',mas[min]);end.
Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...