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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.11.2010, 14:44   #1
ArtJuhn
Пользователь
 
Аватар для ArtJuhn
 
Регистрация: 31.05.2010
Сообщений: 24
По умолчанию Сортировка циклического однонаправленного списока

Есть циклический однонаправленный список, заданный двумя массивами, массивом данных (info) и массивом указателей (pt). Нужно отсортировать список.
Массив данных ведь сортировать не нужно, а нужно лишь перевести указатели ?
Натолкните на идею, каким путём это реализовать.
Элементы массива данных в любом случае нужно будет сравнивать (что бы узнать что чего меньше), или нет?
За основу взял сортировку пузырьком:
Код:
procedure Sort(var info:array of integer);
var i,j,tmp:integer;
begin
  for i:=0 to Length(info)-1 do
    for j:=Length(info)-1 downto i do
      if info[j-1]>info[j] then
        begin
 // тут проблемы...
        end;
end;
Сравнили мы два соседних эл-та массива данных, как дальше быть, как переставить указатели?

Последний раз редактировалось ArtJuhn; 24.11.2010 в 15:15.
ArtJuhn вне форума Ответить с цитированием
Старый 24.11.2010, 15:52   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

если уж мы делаем список то доступ к данным должен быть через этот список (т.е. через массив указатели (pt) который мы и должны сортировать.

procedure Sort(var pt:array of integer);
var i,j,tmp:integer;
begin
for i:=0 to Length(pt)-1 do
for j:=Length(pt)-1 downto i do
if info[pt[j-1]]>info[pt[j]] then
begin
// а теперь меняем pt[j-1] pt[j]
end;
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 24.11.2010 в 16:00.
evg_m вне форума Ответить с цитированием
Старый 24.11.2010, 16:18   #3
ArtJuhn
Пользователь
 
Аватар для ArtJuhn
 
Регистрация: 31.05.2010
Сообщений: 24
По умолчанию

Код:
procedure Sort(var pt:array of integer);
var i,j,tmp:integer;
begin
  for i:=1 to Length(pt) do
    for j:=Length(pt) downto i do
      if info[pt[j-1]]>info[pt[j]] then
        begin
          tmp:=pt[j];
          pt[j]:=pt[j-1];
          pt[j-1]:=tmp
        end;
end;
Не работает. Может быть ошибка в том, что последний эл-т должен ссылаться на первый эл-т ? (ведь список циклический однонаправленный).
Массивы заданы так:
Код:
const
  N=10;

var
  Form1: TForm1;
  Info,pt: array[1..N] of integer;
А в процедуре получается динамический массив (var pt:array of integer). Возможно тут тоже может быть ошибка ?
На всякий случай приведу ещё, как создаю список:
Код:
var i:integer;
begin
  for i:=1 to ListBox1.Items.Count do
    begin
      Info[i]:=StrToInt(ListBox1.Items[i-1]);
      pt[i]:=i+1;
    end;
  pt[ListBox1.Items.Count]:=v; // последний эл-т ссылается на первый, v - указатель, который ссылается на первый эл-т списка,   изначально v:=1;
end;

Последний раз редактировалось ArtJuhn; 24.11.2010 в 16:22.
ArtJuhn вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программная реализация однонаправленного линейного списка Денис Ст Помощь студентам 2 14.01.2014 21:50
Реализация однонаправленного шаблонного связанного списка Blade Общие вопросы C/C++ 17 28.03.2009 19:59
организация циклического алгоритма NEMO1991 Помощь студентам 2 20.12.2008 22:36