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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.09.2012, 16:27   #1
koshkarjov
Пользователь
 
Аватар для koshkarjov
 
Регистрация: 31.01.2009
Сообщений: 26
По умолчанию [Delphi] Сортировка массива

Здравствуйте! Пишу программу, реализующую различные методы сортировок.
Застрял на методе быстрой сортировки, а именно при добавлении в процедуру подсчета числа сравнений и перестановок.

Компилятор выводит вот такие ошибки:
Цитата:
[Error] UnitMain.pas(193): Types of actual and formal var parameters must be identical
[Error] UnitMain.pas(194): Types of actual and formal var parameters must be identical
[Error] UnitMain.pas(258): Not enough actual parameters
[Error] UnitMain.pas(298): Types of actual and formal var parameters must be identical
[Fatal Error] T20_P1.dpr(5): Could not compile used unit 'UnitMain.pas'
Думаю, что я запутался где то в описании переменных...

Код программы можно посмотреть тут. (в сообщение не влез, т.к. превышен лимит символов). Сам проект также прикладываю: sort.rar

Заранее благодарен за помощь!
koshkarjov вне форума Ответить с цитированием
Старый 16.09.2012, 16:45   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
procedure QuickSort (a: TArrayOfInteger; var Cmp, Sw, Left, Right: Integer; toShow: Boolean);
Сколько параметров?
Код:
if left<j then QuickSort(a, left, j, toShow);
А тут сколько?
Найди отличия
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.09.2012, 22:08   #3
koshkarjov
Пользователь
 
Аватар для koshkarjov
 
Регистрация: 31.01.2009
Сообщений: 26
По умолчанию

Тогда получается так (sort.rar).
Теперь возникают ошибки при вызове функции:
Цитата:
[Hint] UnitMain.pas(180): Value assigned to 'N' never used
[Error] UnitMain.pas(257): Not enough actual parameters
[Error] UnitMain.pas(297): Types of actual and formal var parameters must be identical
[Fatal Error] T20_P1.dpr(5): Could not compile used unit 'UnitMain.pas'
Я так понимаю проблема опять в том, что я не все параметры передаю туда?

UPD: Исправлено, смотреть следующее сообщение.

Последний раз редактировалось koshkarjov; 17.09.2012 в 21:16.
koshkarjov вне форума Ответить с цитированием
Старый 17.09.2012, 21:15   #4
koshkarjov
Пользователь
 
Аватар для koshkarjov
 
Регистрация: 31.01.2009
Сообщений: 26
По умолчанию

Исправил программу. Вроде все работает.
Единственное, что непонятно, почему при выводе массив чисел выглядит так:

Дожно же выводить только 4 элемента. Почему идет повтор?

Код программы тут.
koshkarjov вне форума Ответить с цитированием
Старый 17.09.2012, 21:33   #5
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Еще б примерно представить, как должно выглядеть, чтоб понять, что в коде искать.

UPD. Сорри, строчку снизу не заметил...
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 17.09.2012, 21:46   #6
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Судя по трассировке, у Вас в методе QuickSort вот тут цикл проходит в два раза больше, чем нужно (чем элементов в массиве)6

Код:
      for i:=0 to High(a) do
         FormMain.MemoLog.Lines.Add(IntToStr(a[i]));
Так что проверяйте, где у Вас High(a) так увеличивается.

UPD. Хотя сдается мне, что должно быть так:

Код:
for i:=0 to N-1 do
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 17.09.2012 в 21:49.
Sciv вне форума Ответить с цитированием
Старый 17.09.2012, 22:26   #7
koshkarjov
Пользователь
 
Аватар для koshkarjov
 
Регистрация: 31.01.2009
Сообщений: 26
По умолчанию gffg

Цитата:
Сообщение от Sciv Посмотреть сообщение
Хотя сдается мне, что должно быть так:
Код:
for i:=0 to N-1 do
Если я правильно понял, то так?
Код:
procedure QuickSort(a: TArrayOfInteger; var Cmp, Sw : Integer; Left, Right: Integer; toShow: Boolean);
var
  i,j,sred,temp,N:integer;
begin
   Cmp:=0;
   Sw:=0;
   N:=Length(a);
   i:=left; j:=right; //установка начальных границ подмассива
   sred:=a[(left+right) div 2]; //определение серединного элемента
   repeat
      while (a[i]<sred) do Begin i:=i+1; Inc(Cmp); End; //поиск слева элемента, большего опорного
      while (a[j]>sred) do Begin j:=j-1; Inc(Cmp); End; //поиск справа элемента, меньшего опорного
      if i<=j then
      begin //обмениваем элементы и изменяем индексы
         temp:=a[i]; a[i]:=a[j]; a[j]:=temp;
         i:=i+1; j:=j-1;
         Inc(Sw);
      end;
   until i>j;
   if left<j then QuickSort(a, Cmp, Sw, left, j, toShow); //обработка левой половины
   if i<right then QuickSort(a, Cmp, Sw, i, right, toShow); //обработка правой половины
   //если надо, выводим полученный массив, чтобы убедиться, что все работает как надо
   if toShow then
      for i:=0 to N-1 do
         FormMain.MemoLog.Lines.Add(IntToStr(a[i]));
end;
Все равно не работает
koshkarjov вне форума Ответить с цитированием
Старый 18.09.2012, 10:44   #8
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Понятно... Предыдущий вариант (который с High(a)) работал лучше, возвращаем его обратно.

А увеличение данных у Вас берется из-за рекурсивного вызова QuickSort.
Вместо передачи в рекурсию ToShow сделайте так:

Код:
   
if left<j then QuickSort(a, Cmp, Sw, left, j, false); 
if i<right then QuickSort(a, Cmp, Sw, i, right, false);
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 18.09.2012, 11:56   #9
koshkarjov
Пользователь
 
Аватар для koshkarjov
 
Регистрация: 31.01.2009
Сообщений: 26
По умолчанию

Sciv, спасибо! Теперь выводит корректно.

Но мне кажется, что число сравнений и перестановок (Cmp и Sw) не работает как надо. Например, при массиве чисел 10000, число сравнений=0, а число перестановок=1. Вроде же не должно так быть?
koshkarjov вне форума Ответить с цитированием
Старый 18.09.2012, 12:29   #10
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Сообщение от koshkarjov Посмотреть сообщение
Но мне кажется, что число сравнений и перестановок (Cmp и Sw) не работает как надо.
Не работает, потому что они у Вас локально в процедурах обнуляются - в самом начале. Раз уж Вы объявили их как var в описаниях процедур - строчки

Код:
Cmp:=0;
Sw:=0;
вообще не нужны, а в случае рекурсии - еще и косячны. Убирайте этот код из всех сортировок
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 18.09.2012 в 12:35.
Sciv вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Delphi] сортировка массива Arlain Помощь студентам 0 06.05.2012 10:46
Сортировка массива в Delphi Ника_1 Помощь студентам 6 13.11.2011 02:48
Сортировка массива(Delphi 3.0) SUMR04 Помощь студентам 0 16.12.2009 19:09
Delphi. Сортировка массива eluminat Помощь студентам 4 30.06.2009 11:55