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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.06.2010, 23:11   #1
AnDrOiD73
Пользователь
 
Регистрация: 05.06.2010
Сообщений: 21
По умолчанию Метод сортировки естественным слиянием

есть структура записи, процедура для сортировки естественным слиянием, которая немного не так работает, а именно вообще пропадают некоторые записи - помогите ее подправить.

Код:
type
 db_bibl=record
    avtor: string;
    name: string;
    izdat: string;
    god: string;
    end;

var
bibl: array [1..100] of db_bibl;

//процедура для сортировки естественным слиянием
procedure MergeSort_avtor(n: integer); //n - это текущее кол-во записей в массиве bibl
{Процедура сортировки слиянием}
var
i, j, k, t, s, Start1, Fin1, Fin2: integer;
B: array [1..100] of string;
begin
k := 1; {Начальное значение длины участков}
while k < n do begin {пока участок не весь массив}
t := 0; {начало 1-й пары участков}
while t+k < n do begin {пока не все участки просмотрели}
{Определяем границы рассматриваемых участков}
Start1 := t+1; Fin1 := t+k; {Начало и конец 1-го участка}
if t+2*k > n then Fin2 := n
else Fin2 := t+2*k; {Конец 2-го участка}
i := Start1; {Начальное значение индекса в 1-м участке}
j := Fin1 + 1; {Начальное значение индекса в 2-м участке}
s := 1; {Начальное значение индекса в массиве B}
{Заполняем B элементами из двух участков}
while (i <= Fin1) and (j <= Fin2) do begin
{Сравниваем попарно элементы из двух участков}
if bibl[i].avtor < bibl[j].avtor then begin
{Вставляем элемент из 1-го участка}
B[s] := bibl[i].avtor;
i := i + 1;
end else begin
{Вставляем элемент из 2-го участка}
B[s] := bibl[j].avtor;
j := j + 1;
end;
s := s + 1;
end;
{Добавляем в массив B оставшиеся элементы из 1-го участка}
while (i <= Fin1) do begin
B[s] := bibl[i].avtor;
i := i + 1; s := s + 1;
end;
{Добавляем в массив B оставшиеся элементы из 2-го участка}
while (j <= Fin2) do begin
B[s] := bibl[i].avtor;
j := j + 1; s := s + 1;
end;
t := Fin2; {Переходим к следующей паре участков}
end;
k := k * 2; {Удваиваем значение длины участков}
{Сохраняем полученный промежуточный результат}
for s := 1 to t do bibl[s].avtor := B[s];
end;
end;
Изначально данные выглядят так: http://s47.radikal.ru/i117/1006/b0/75339e18edcc.jpg а после сортировки некоторые становятся просто пустыми http://i057.radikal.ru/1006/f8/1ba2a6f9ceb5.jpg
становятся они пустыми в последней строчки процедуры "for s := 1 to t do bibl[s].avtor := B[s];" с индексами похоже что то не так... помогите подправить...
Весь проект тут http://ifolder.ru/18295616 сортировка находится на 3-ей форме.
AnDrOiD73 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метод быстрой сортировки Nord18 Паскаль, Turbo Pascal, PascalABC.NET 1 05.06.2010 11:24
Однофазная сортировка естественным слиянием dima154 Помощь студентам 0 20.11.2009 00:12
сортировка естественным слиянием ArtFul777 Паскаль, Turbo Pascal, PascalABC.NET 1 18.11.2008 19:36