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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.03.2012, 12:37   #1
Reydan-46
Новичок
Джуниор
 
Регистрация: 22.03.2012
Сообщений: 2
Вопрос Как сделать пошаговую сортировку Шелла? Delphi

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

Код:
Procedure Sort;
const n=10;
var len,q,i,j,k,s,x,m:integer;
	h:array[1..n] of integer;
begin
	q:=n div 2; //* Вычисление шагов */
  len:=0;     // переменная количества шагов
  while q>0 do // пока шаг>0
  begin
    inc(len);   // увеличиваем количество шагов
    h[len]:=q;  // добавляем шаг в масив
    q:=q div 2; // вычисляем новый шаг
  end;
	for m:=1 to len do   // проход по всем шагам
	begin
		k:=h[m];           // задаём шаг
		s:=-k;             // задаём номер барьера
		for i:=k+1 to n do // проход по группам
    begin
			x:=mass[i];         // берём элемент массива (i)
			j:=i-k;             // вычисляем номер элемента группы
			if s=0 then s:=-k;  // если номер барьера 0 то барьер:=-шаг
			s:=s+1;             // номер барьера +1
			mass[s]:=x;         // помещаем элемент массива (i) в барьер
			while x<mass[j] do   // пока элемент массива (i) < элемента своей группы
			begin
				mass[j+k]:=mass[j]; // если true то сдвигаем по группе назад
				j:=j-k;             // вычисляем след. номер элемента группы
			end;
			mass[j+k]:=x;  // если false то вставляем элемент массива (i) из барьера
		end;
	end;
end;
Буду благодарен за любую помощь.
Reydan-46 вне форума Ответить с цитированием
Старый 22.03.2012, 13:06   #2
VIK_aka_TOR
Участник клуба
 
Аватар для VIK_aka_TOR
 
Регистрация: 30.01.2011
Сообщений: 1,578
По умолчанию

как вариант могу предложить сделать это через case...
при этом нужно будет поставить "счетчик"... мол который раз выполняется процедура... и в зависимости от счетчика в case выбирать определенную строку с действиями... но тогда вам придется все переменные процедуры сделать глобальными переменными... как и сам счетчик...
такая вот идея...
пишу код не только за печеньки
VIK_aka_TOR вне форума Ответить с цитированием
Старый 23.03.2012, 08:38   #3
Reydan-46
Новичок
Джуниор
 
Регистрация: 22.03.2012
Сообщений: 2
По умолчанию

Спасибо, сделал таким образом:
Все переменные - глобальные.
При создании массива указываю начальные данные
Код:
  q:=n div 2; //* Вычисление шагов */
  len:=0;   
  while q>0 do
  begin
    inc(len); 
    h[len]:=q;
    q:=q div 2;
  end;
  m:=1;
  k:=h[m];
  i:=k;
  s:=-k;
И сама процедура сортировки
Код:
Procedure StepSort;
begin
  case m of
    1..3:begin
        if i<>10 then inc(i)
        else
          begin
            inc(m);
            k:=h[m];
            i:=k+1;
            s:=-k;
          end;
      end;
  end;
  if m<=3 then
  begin
    x:=mas[i]; 
    j:=i-k;   
    if s=0 then s:=-k; 
    s:=s+1;     
    mas[s]:=x; 
    while x<mas[j] do
    begin
	  mas[j+k]:=mas[j];
	  j:=j-k;
    end;
    mas[j+k]:=x;
    if (m=3) and (i>=10) then inc(m); // для того что бы case больше не сработал
  end;
end;

Последний раз редактировалось Reydan-46; 23.03.2012 в 08:47.
Reydan-46 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Через сортировку Шелла создать программу по убыванию Novenkaja Помощь студентам 3 29.03.2011 21:34
как сделать сортировку для отрицательных элементов? Irisk Паскаль, Turbo Pascal, PascalABC.NET 6 23.12.2010 20:05
Прогамма должна выполнять сортировку имен в лексикографическом порядке методом Хоора и Шелла. ser_b Помощь студентам 2 27.05.2010 21:26
DBGrid: Как сделать собственную сортировку данных? AnTe БД в Delphi 17 26.02.2009 17:38
Как сделать сортировку (поиск) Delphi+Access Toska БД в Delphi 6 28.08.2008 22:32