Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Разработать алгоритм и программу поиска и сортировки элементов массива.

Автор: Grief 8.04.2010 22:55

Разработать алгоритм и программу поиска и сортировки элементов массива.
В программе необходимо использовать структуру меню и подпрограммы пользователей (Способ получения элементов массива, Алгоритма поиска, Алгоритм сортировки).

Способ получения элементов массива: Ввод с клавиатуры
Алгоритм поиска: Сравнение с выделенной ячейкой (min)
Алгоритм сортировки: Быстрая сортировка (по возрастанию)

Если есть у кого какие мысли, буду рад их почитать (:

Автор: Unconnected 8.04.2010 22:58

Мы, в свою очередь, будем рады почитать твои (:

Автор: Grief 8.04.2010 23:08

Цитата(Unconnected @ 8.04.2010 18:58) *

Мы, в свою очередь, будем рады почитать твои (:

Ага-ага))) Чуть позже только, я тут мудрю =_= Что-то мне этакая задачка не по вкусу ._.

Автор: Unconnected 8.04.2010 23:36

Ну, меню можно самое простое - с вводом номера нужного пункта. Алгоритмы поиска и сортировки есть в форумном FAQ (красная ссылка в верху страницы).

Автор: Client 8.04.2010 23:38

мысли... ну вот : ввод и поиск - пустяки, кода совсем не много. А сортировка есть в FAQ. меню - это как сделаешь (тоже не трудно, поиши примеры)

Автор: Grief 9.04.2010 2:09

Ну вот я нашел в FAQ программку, но это все же немного не то, я имею ввиду про сортировку, откровенно признаюсь, проблемы с этим, выручайте..)
Меню я присобачить смогу, а вот с поиском тоже проблемы возникают unsure.gif

program Sort_Mas;
const n=8; { Размерность массива }
var
i,j : byte; { Счетчики в циклах }
imin: byte; { Индекс минимального элемента }
k,c : integer;
min : integer; { Минимальный элемент }
a : array [1..n] of integer;
begin
{ Заполнение массива }
for i:=1 to n do
begin
write('a[',i,']=');
readln(a[i]);
end;
{ Пузырьковая сортировка по возрастанию }
for i:=2 to n do
for j:=n downto i do
begin
if a[j-1]>a[j] then
begin
c:=a[j-1];a[j-1]:=a[j];a[j]:=c;
end;
end;
{ Ставим максимальные элементы на нужные позиции }
i:=1;k:=n;
while k>(n div 2)+1 do
begin
c:=a[i];
a[i]:=a[k];
a[k]:=c;
i:=i+2;
k:=k-1;
end;
{ Ставим минимальные элементы на нужные позиции }
i:=2;k:=0;
while k<(n div 2) do
begin
min:=a[i-1];imin:=i-1;
for j:=i-1 to n do
if a[j]<min then begin min:=a[j];imin:=j;end;
c:=a[i];
a[i]:=a[imin];
a[imin]:=c;
i:=i+2;
k:=k+1;
end;
{ Вывод отсортированного массива }
for i:=1 to n do write(a[i],' ');
readln;
end.

Автор: Client 9.04.2010 2:20

такого поиска мин элемента я еще не видел smile.gif (если имеено это и подразумевается)

  k:=1;min:=1;
for i:=2 to n do begin
if a[i] > a[k] then k:=i;
if a[i] < a[min] then min:=i
end;
В k будет индекс максимального, в min - индекс минимального

Автор: Krjuger 9.04.2010 20:00

М,а я вот понять не могу при чем тут пузырьковая сортировка,когда у вас по заданию быстрая.Это немного разные вещи.Более того быстрая сортировка имеет рекурсивную природу.Так же в ней можно выбрать разные способы разбиения.
В приводимом ниже алгоритме быстрой сортировки в качестве значения разбиения используется среднее значение. Хотя такой подход не всегда является наилучшим, он достаточно прост и сортировка будет выполняться правильно.


procedure QuickSort(var item: DataArray; count:integer);
procedure qs(l, r: integer; var it: DataArray);
var
i, j: integer;
x, y: DataItem;
begin
i:=l; j:=r;
x:=it[(l+r) div 2];
repeat
while it[i]<x do i := i+1;
while x<it[j] do j := j-1;
if y<=j then
begin
y := it[i];
it[i] := it[j];
it[j] := y;
i := i+1; j := j-1;
end;
until i>j;
if l<j then qs(l, j, it);
if l<r then qs(i, r, it)
end;
begin
qs(1, count, item);
end; { конец быстрой сортировки }



Я думаю разобраться не сложно.Внутренню процедуру можно и по другому назвать.

Автор: volvo 9.04.2010 20:15

Цитата
сортировка будет выполняться правильно.
Не будет. Зависнет напрочь и все. Чтобы выполнялась правильно - надо правильно реализовать, а не просто так ответить... Условие "if y<=j then" к быстрой сортировке не имеет отношения...

Автор: Krjuger 11.04.2010 21:46

Да я дико извиняюсь,описался.
Так же я думаю могут возникнуть вопросы по поводу неких типов DataArray, DataItem.В общем вот полный код.


program tester;
type
DataItem =char;
DataArray = array [1..80] of DataItem;
var
test1: DataArray;
t, t2: integer;
testfile: file of char;

procedure QuickSort(var item: DataArray; count:integer);
procedure qs(l, r: integer; var it: DataArray);
var
i, j: integer;
x, y: DataItem;
begin
i:=l;
j:=r;
x:=it[(l+r) div 2];
repeat
while it[i]<x do i := i+1;
while x<it[j] do j := j-1;
if i<=j then {не у а i }
begin
y := it[i];
it[i] := it[j];
it[j] := y;
i := i+1;
j := j-1;
end;
until i>j;
if l<j then qs(l, j, it);
if l<r then qs(i, r, it)
end;
begin
qs(1, count, item);
end;

begin
Assign(testfile, 'test.txt');
Reset(testfile);
t := 1;
{ считывание символов,которые будут сортироваться.}
while not Eof(testfile) do begin
read(testfile, test1[t]);
t := t+1;
end;
t := t-1; {скорректировать число считанных элементов }
QuickSort(test1,t);
{ выдать отсортированный массив символов }
for t2 := 1 to t do write(test1[t2]);
WriteLn;
Readln;
end.