Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка списков, Сортировка списков 
:(
    Опции темы
Sortirovshik
Дата 2.11.2004, 13:36 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Уже оброщался на этот форум за помощю по этому вопросу, но мне не смогли помоч. Попытаюсь еще разок!
Существеет Mas1 и Маs2. Mas1 содержит числа, а Mas2 указатель (число) на следующую ячейку. Список циклический (последний указатель указывает на первую ячейку) и однонаправленный (понятное дело, что можно идти только в одну сторону). Идем по списку так: берем любое число, ну допустим 8. Под ним указатель 4. Переходим к ячейкам 4. Там число 6 и указатель 5! и.т.д.

9 7 8 6 5
2 3 4 5 1

Задача! Отсортировать значения первого массива переставляя указатели второго массива. Должно получиться так!

9 7 8 6 5
5 3 1 2 4

:sample :stena
  Вверх
maxim1000
Дата 2.11.2004, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 4
Всего: 110



циклический список невозможно отсортировать...


--------------------
qqq
PM WWW   Вверх
Guest
Дата 2.11.2004, 13:54 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Да лаааадно! Ну относительно любого элимента!
  Вверх
maxim1000
Дата 2.11.2004, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 4
Всего: 110



тогда нужно разорвать список - указать первый элемент
если по-быстрому (в смысле написания алгоритма, а не его работы), то проще всего сортировка пузырьком: идем по списку, находим два соседних элемента, стоящих в неправильном порядке, меняем их местами


--------------------
qqq
PM WWW   Вверх
Guest
Дата 2.11.2004, 14:28 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Но ведь если мы будем менять 2 указателя местами может случиться такое дело, когда указатель указывает на свою же ячейку! :rtfm
  Вверх
~FoX~
Дата 2.11.2004, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 13
Всего: 68



Тебе же Underdark дал код, чем он тебя не устроил?


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Guest
Дата 2.11.2004, 15:35 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Да вот такая проблема! Я переставляю указатели местами, и получается такая штука: указатель указывает не на следующий элимент, а на себя.

  Вверх
Akina
Дата 2.11.2004, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



Во я не понял - чего тут делать перестановками?
Грохаем массив указателей. Делаем копию списка. Сортирим ее. В соответствии с сортировкой строим новый массив указателей. Все.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maxim1000
Дата 2.11.2004, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 4
Всего: 110



Цитата
Но ведь если мы будем менять 2 указателя местами может случиться такое дело, когда указатель указывает на свою же ячейку!

я не говорил "поменять местами два указателя", нужно поменять местами два элемента списка, который описывается этими двумя массивами, это совсем разные вещи
и так, насколько я понял, проблема свелась к тому, чтобы поменять два соседних элемента местами:
в этой операции участвуют четыре элемента:
...A->B->C->D... (B,C - эмеленты, которые надо поменять)
нужно сделать так:
...A->C->B->D...
для этого нужно перенаправить три указателя:
указатель A вместо B должен указывать на C
указатель B вместо C должен указывать на D
указатель C вместо B должен указывать на B

отдельно нужно рассмотреть случай, когда B - первый элемент, тогда:
указатель B - на D
указатель C - на B
и еще нужно объявить C первым элементом
Добавлено @ 16:04
Цитата
Во я не понял - чего тут делать перестановками?
Грохаем массив указателей. Делаем копию списка. Сортирим ее. В соответствии с сортировкой строим новый массив указателей. Все.

... в таких случаях я говорю "а слона-то я и не заметил"...
действительно, все эти перестановки ни к чему...


--------------------
qqq
PM WWW   Вверх
~FoX~
Дата 2.11.2004, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 13
Всего: 68



Цитата(maxim1000 @ 2.11.2004, 16:03)

отдельно нужно рассмотреть случай, когда B - первый элемент, тогда:
указатель B - на D
указатель C - на B
и еще нужно объявить C первым элементом

Какие могут быть первые - вторые etc. элименты в замкнутых списках?


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
maxim1000
Дата 2.11.2004, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 4
Всего: 110



Цитата
Какие могут быть первые - вторые etc. элименты в замкнутых списках?

Цитата
Да лаааадно! Ну относительно любого элимента!

Цитата
тогда нужно разорвать список - указать первый элемент



--------------------
qqq
PM WWW   Вверх
Guest
Дата 2.11.2004, 17:26 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(Akina @ 2.11.2004, 16:00)

Во я не понял - чего тут делать перестановками?
Грохаем массив указателей. Делаем копию списка. Сортирим ее. В соответствии с сортировкой строим новый массив указателей. Все.


Обясните пожалуцста попонятнее! Нефина не понял!
  Вверх
Underdark
Дата 2.11.2004, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 12.7.2004
Где: Ульяновск

Репутация: 1
Всего: 2



Цитата
Да вот такая проблема! Я переставляю указатели местами, и получается такая штука: указатель указывает не на следующий элимент, а на себя.


Народ!!! :notify Ссорри! Я очень сильно извиняюсь, но код я сразу не смог проверить, поэтому туды закралась ошибка!
Сейчас я код доработал, НО!!! я опять его реально ещё не проверял (ну нету у меня под рукой компилятора! :hehe ). Сматрите сами:

Код

var
temp: integer;
a, b: array[1..6] of integer;
i, j: integer;
begin
for i := 1 to 5 do
for j := i to 6 do
begin
if a[b[i]] > a[b[j]] then
begin
 temp := b[b[i]];
 b[b[i]] := b[b[j]];
 b[b[j]] := temp;
 temp := b[i];
 b[i] := b[j];
 b[j] := temp;
end;
end;
end;



:omg Народ!!! я опять ошибку тута нарыл, так что прошу весь этот код считать недействительным!!! Я завтра рабочий код принесу... Это уж точно :qstn

Это сообщение отредактировал(а) Underdark - 2.11.2004, 18:46
PM MAIL   Вверх
Guest
Дата 3.11.2004, 12:48 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Эххх. Было бы здорово! :)
  Вверх
Underdark
Дата 3.11.2004, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 12.7.2004
Где: Ульяновск

Репутация: 1
Всего: 2



Всё, кажись готово :p
Алгоритм сложный, поэтому лучше воспользоваться предыдущими советами, но если необходимо составить программу не вводя новые массивы, а сортируя массив указателей, то это то что надо:
Код

var
 temp: integer;
 a: array[1..6] of integer;
 b: array[0..6] of integer;{в позиции 0 будет храниться указатель на "начало" списка}
 i, j: integer;


{Следующая функция поможет найти по указателям в массиве b необходимый элемент под
  номером NOM в массиве a. Вернёт номер элемента массива b, который указывает на NOM}
function vibor(nom: byte): byte;
var
k, temp2: byte;
begin
temp2:=0;
for k:=2 to nom do
 begin
  temp2:=b[temp2];
 end;
vibor:=temp2;
end;

{сортировка}
procedure TForm1.Button2Click(Sender: TObject);
var
vib1, vib2: byte;
begin
{найдем сначала указатель на самый минимальный элемент массива a.
 Будем считать его "началом" списка}
b[0]:=b[1];
for i:=2 to 6 do
if a[b[0]]>a[b[i]] then b[0]:=b[i];
{Собственно сортировка}
for i := 1 to 5 do
for j:=i+1 to 6 do
begin
vib1:=vibor(i);
vib2:=vibor(j);
if a[b[vib1]] > a[b[vib2]] then
begin
 temp := b[vib1];
 b[vib1] := b[vib2];
 b[vib2] := temp;
 temp := b[b[vib1]];
 b[b[vib1]] := b[b[vib2]];
 b[b[vib2]] := temp;
end;
end;
end;


Надеюсь, я не опоздал с кодом... ;-)
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0584 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.