IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Метод Шелла с шагом Хиббарда, для матрицы
Renbo
сообщение 17.12.2006 20:20
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 86
Пол: Мужской

Репутация: -  0  +


вот собственно программа которая сортирует строки матрицы методом шелла с шагом N/2:

TYPE mas = array [1..100,1..100] of integer;
VAR
I,N, M, J : Integer;
a:mas;

Procedure Sort( var a : mas; N, M:Integer);
Var
d, i, t : integer;
k : boolean;
begin
d:=N div 2;
while d>0 do
begin
k:=true;
while k do
begin
k:=false;
for I:=1 to M do
for J:=1 to N-d do
begin
if a[I,J] > a[I,J+d] then
begin
t:=a[I,J]; a[I,J]:=a[I,J+d]; a[I,J+d]:=t;
k:=true;
end;
end;
end;
d:=d div 2;
end;
end;

Begin
write ('введите количество строк ');
read (M);
write ('введите количество столбцов ');
read (N);
For I:=1 to M do
For J:=1 to N do
begin
write ('введите a[',I,',',J,']= ');
read (a[I,J]);
end;
Sort(a,N,M);
For I:=1 to M do
For J:=1 to N do
writeln (a[I,J]);
END.






Кстати по идее если почитать литературу, то тут сортировка тоже не совсем корректная в плане шага. Так как мне изменить шаг, чтобы он был как у Хиббарда?

Сообщение отредактировано: Renbo - 17.12.2006 20:25
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 17.12.2006 20:56
Сообщение #2


Гость






Я правильно помню, что "шаг Хиббарда" - это 1, 3, ... (2^k) - 1 ?

Тогда:
Procedure Sort( var a : mas; N, M:Integer);
Var
d, i, t : integer;
k : boolean;
the_n: integer;
begin
while ($1 shl the_n) < N do inc(the_n);
dec(the_n);
d := pred($1 shl the_n); { <--- Находим максимальное значение шага Хиббарда }

while d>0 do begin
k:=true;
while k do begin
k:=false;
for I:=1 to M do
for J:=1 to N-d do begin
if a[I,J] > a[I,J+d] then begin
t:=a[I,J]; a[I,J]:=a[I,J+d]; a[I,J+d]:=t;
k:=true;
end;
end;
end;
dec(the_n);
d := pred($1 shl the_n); { <--- И уменьшаем его }
end;
end;

 К началу страницы 
+ Ответить 
Renbo
сообщение 17.12.2006 21:47
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 86
Пол: Мужской

Репутация: -  0  +


Правильно )
для вектора из 11 элементов шаги равны 7, 3, 1 - у Хиббарда,
8,4,2,1 - у Шелла.

а вот что означает $1 или $l и dec? blink.gif
и чем отличается shl от div?


Сообщение отредактировано: Renbo - 17.12.2006 22:18
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 18.07.2025 14:17
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"