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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.12.2009, 22:08   #1
madmonk
 
Регистрация: 07.12.2009
Сообщений: 9
По умолчанию Задача Pascal (Сортировка метод Шелла)

Дана матрица. Упорядочить элементы столбцов матрицы по возрастанию, а сами столбцы по возрастанию элементов последней строки. Использовать сортировку Шелла, реализовав метод в виде подпрограммы.

Не сортирует.

Код:
Program a334;
type
  ta=array[1..1000,1..1000] of integer;
var
  a:ta;
  r,s:integer;
  i,j,imin,jmin:integer;
  n,m:integer;
  amin:real;

procedure shell(var a:ta;r,s:integer); { Сортировка Шелла }
var c,z,incr,i:integer;
begin
incr:= r div 2;
while  incr>0 do begin
  for  z:=incr+1 to r do  begin
	i:= z-incr;
	while  j>0 do
	  if a[i,s]>a[i+incr,s] then  begin
	  		c:= a[i,s]; a[i,s]:=a[i+incr,s];
			a[i+incr,s]:=a[i,s];
			j:=i-incr
	  end
	  else   i:=0   { остановка проверки }
  end;
  incr:= incr div 2
end;
end; { конец сортировки Шелла  }
  
begin
  write('Введите колличество строк: ');
  readln(m);
  write('Введите колличество столбцов: ');
  readln(n);
  for i:=1 to m do
  for j:=1 to n do
    begin
      write('Введите ',i,j,' элемент матрици А: ');
      readln(a[i,j]);
    end;
writeln('matrica A');
 for i:=1 to m do
   begin
    for j:=1 to n do
     write (a[i,j],' ');
    writeln;
   end;
   
shell(a,m,n);

writeln('matrica B');
 for i:=1 to m do
   begin
    for j:=1 to n do
     write (a[i,j],' ');
    writeln;
   end;


readln;
end.
madmonk вне форума Ответить с цитированием
Старый 08.12.2009, 17:04   #2
madmonk
 
Регистрация: 07.12.2009
Сообщений: 9
По умолчанию

Код:
Program a334;
type
  ta=array[1..1000,1..1000] of integer;
var
  a:ta;
  i,j:integer;
  n,m:integer;

procedure shell(var a:ta); { ñîðòèðîâêà Øåëëà }
var c,z,incr,k:integer;
begin
i:=0;
j:=0;
for  k:=1 to n do begin
incr:= m div 2;
while  incr>0 do
  begin
    for  z:=incr+1 to m do
      begin

	      i:= z-incr;
	      while  i>0 do
	        if a[i,k]>a[i+incr,k] then
            begin
	  	        c:=a[i,k];
              a[i,k]:=a[i+incr,k];
              a[i+incr,k]:=c;
			        j:=i-incr;
	          end
	                            else
            i:=0;   { îñòàíîâêà ïðîâåðêè }
      end;
        incr:= incr div 2
   end; end;
  end; { êîíåö ñîðòèðîâêè Øåëëà }
  
begin
  write('ââåäèòå êîëè÷åñòâî ñòðîê: ');
  readln(m);
  write('ââåäèòå êîëè÷åñòâî ñòîëáöîâ: ');
  readln(n);
  for i:=1 to m do
  for j:=1 to n do
    begin
      write('Ââåäèòå ',i,j,' ýëåìåíò ìàòðèöû À: ');
      readln(a[i,j]);
    end;
writeln('matrica A');
 for i:=1 to m do
   begin
    for j:=1 to n do
     write (a[i,j],' ');
    writeln;
   end;
   
shell(a);

writeln('matrica B');
 for i:=1 to m do
   begin
    for j:=1 to n do
     write (a[i,j],' ');
    writeln;
   end;


readln;
end.
исправил, и половина задачи работает, сортирует столбцы по возрастанию, но вот как теперь сделать чтоб сами столбцы сортировалисть по возрастанию элементов последней строки. Использовать сортировку Шелла, реализовав метод в виде подпрограммы.
madmonk вне форума Ответить с цитированием
Старый 08.12.2009, 17:37   #3
madmonk
 
Регистрация: 07.12.2009
Сообщений: 9
По умолчанию

Код:
Program a334;
type
  ta=array[1..1000,1..1000] of integer;
var
  a:ta;
  i,j:integer;
  n,m:integer;

procedure shell(var a:ta); { sortirovka shella }
var c,z,incr,k:integer;
begin
for  k:=1 to n do begin
incr:= m div 2;
while  incr>0 do
  begin
    for  z:=incr+1 to m do
      begin

	      i:= z-incr;
	      while  i>0 do
	        if a[i,k]>a[i+incr,k] then
            begin
	  	        c:=a[i,k];
              a[i,k]:=a[i+incr,k];
              a[i+incr,k]:=c;
			        j:=i-incr;
	          end
	                            else
            i:=0;   { ostonovka proverki }
      end;
        incr:= incr div 2
   end; end;
  end; { konec sortirovki shella }
procedure shell2(var a:ta); { sortirovka shella }
var c,z,incr,k:integer;
begin
incr:= m div 2;
while  incr>0 do
  begin
    for  z:=incr+1 to n do
      begin

	      i:= z-incr;
	      while  i>0 do
	        if a[m,i]>a[m,i+incr] then
            begin
            for k:=1 to  m  do
            begin
	  	        c:=a[k,i];
              a[k,i]:=a[k,i+incr];
              a[k,i+incr]:=c;
			        j:=i-incr;
            end;
	          end
	                            else
            i:=0;   { ostonovka proverki }
      end;
        incr:= incr div 2
   end;
  end; { konec sortirovki shella }

begin
  write('Vvedite kolichestvo strok: ');
  readln(m);
  write('Vvedite kolichestvo stolbcov: ');
  readln(n);
  for i:=1 to m do
  for j:=1 to n do
    begin
      write('Vvedite ',i,j,' element matreci A: ');
      readln(a[i,j]);
    end;
writeln('matrica A');
 for i:=1 to m do
   begin
    for j:=1 to n do
     write (a[i,j],' ');
    writeln;
   end;
   
shell(a);

writeln('matrica B');
 for i:=1 to m do
   begin
    for j:=1 to n do
     write (a[i,j],' ');
    writeln;
   end;
   
shell2(a);

writeln('matrica C');
 for i:=1 to m do
   begin
    for j:=1 to n do
     write (a[i,j],' ');
    writeln;
   end;


readln;
end.
вроде все правлильно сделал. проверте пожалуста
И можно это как-то упростить?
madmonk вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка Шелла и Шейкер-сортировка AleksandrMakarov Паскаль, Turbo Pascal, PascalABC.NET 11 11.03.2012 12:18
Метод сортировки Шелла SVadiks Помощь студентам 2 03.11.2009 20:17
сортировка Шелла pilot76 Помощь студентам 2 17.08.2009 18:05
Помогите решить задачу в C++ на массивы + сортировка методом Шелла Exact Помощь студентам 2 18.06.2009 14:44