Помощь - Поиск - Пользователи - Календарь
Полная версия: Разработать алгоритм и программу поиска и сортировки элементов массива.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Grief
Разработать алгоритм и программу поиска и сортировки элементов массива.
В программе необходимо использовать структуру меню и подпрограммы пользователей (Способ получения элементов массива, Алгоритма поиска, Алгоритм сортировки).

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

Если есть у кого какие мысли, буду рад их почитать (:
Unconnected
Мы, в свою очередь, будем рады почитать твои (:
Grief
Цитата(Unconnected @ 8.04.2010 18:58) *

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

Ага-ага))) Чуть позже только, я тут мудрю =_= Что-то мне этакая задачка не по вкусу ._.
Unconnected
Ну, меню можно самое простое - с вводом номера нужного пункта. Алгоритмы поиска и сортировки есть в форумном FAQ (красная ссылка в верху страницы).
Client
мысли... ну вот : ввод и поиск - пустяки, кода совсем не много. А сортировка есть в FAQ. меню - это как сделаешь (тоже не трудно, поиши примеры)
Grief
Ну вот я нашел в 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
такого поиска мин элемента я еще не видел 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
М,а я вот понять не могу при чем тут пузырьковая сортировка,когда у вас по заданию быстрая.Это немного разные вещи.Более того быстрая сортировка имеет рекурсивную природу.Так же в ней можно выбрать разные способы разбиения.
В приводимом ниже алгоритме быстрой сортировки в качестве значения разбиения используется среднее значение. Хотя такой подход не всегда является наилучшим, он достаточно прост и сортировка будет выполняться правильно.

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
Цитата
сортировка будет выполняться правильно.
Не будет. Зависнет напрочь и все. Чтобы выполнялась правильно - надо правильно реализовать, а не просто так ответить... Условие "if y<=j then" к быстрой сортировке не имеет отношения...
Krjuger
Да я дико извиняюсь,описался.
Так же я думаю могут возникнуть вопросы по поводу неких типов 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.

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.