Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.06.10;
Скачать: CL | DM;

Вниз

Сортировка по алфавиту   Найти похожие ветки 

 
Random   (2002-05-30 20:35) [0]

Имеется список вида
TElem = record
inf:string[30];
prev,next:PElem;
end;
Как упорядочить его по алфавиту элементов inf ?


 
ggrisha   (2002-05-30 20:54) [1]

Ну например:
Способ 1 Загнать строки или ссылки на них в массив и отсортировать любым из способов. Потом сделать из массива список.
Способ 2 Находим элемент с наименьшим inf записываем в начало нового списка и удаляем из старого, далее процесс повторяется.


 
Random   (2002-05-30 21:26) [2]

Не, нужен третий способ. Сравнить - поменять местами. Как в сортировке массива. Кто знает - помогите!


 
Anatoly Podgoretsky ©   (2002-05-30 21:57) [3]

Random (30.05.02 20:35)
Живи проще, загони в StringList и позволь ему отсортировать


 
Random   (2002-05-30 22:13) [4]

2Anatoly: я бы с радостью, но нужно именно так. Важен сам алгоритм сортировки списка :( Помогите, а? Вот скажем такой код:
Repeat
changed:=false;
if x.next <> nil then begin
If x.inf > x.next.inf
then begin
buf:=x.next.inf;
x.next.inf:=x.inf;
x.inf:=buf;
changed:= true;
end;
Sort(x.next,changed);
end;
Until not changed;
Работать не хочет. Что в нем изменить, чтобы заработало?


 
Anatoly Podgoretsky ©   (2002-05-30 22:21) [5]

Тогда TList в нем есть метод Sort, иначе сам пиши сортировку, у Кнута этому посвящен целый том, свыше тысячи страниц


 
KilkennyCat ©   (2002-05-31 01:48) [6]

Твой алгоритм выполняется, пока переменная changed не станет фалзе. Похоже, у нее есть риск никогда такою не стать, после первого присваивания true, если в Sort не вернется false. А как только вернется, так и цикл закончится.


 
MBo ©   (2002-05-31 07:20) [7]

в данном случае не нужно менять местами сами элементы

var Head:PItem;

implementation

{$R *.DFM}

procedure DispList;
var Temp,Item:PItem;
begin
if Head=nil then Exit;
Item:=Head^.next;
repeat
Temp:=Item^.Next;
Dispose(Item);
Item:=Temp;
until Item=nil;
Dispose(Head);
Head:=nil;
end;

//заполнение
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
item,Temp:PItem;
begin
Randomize;
if Head<>nil then DispList;
new(Head);
Temp:=Head;
for i:=1 to 10 do begin
new(Item);
Item^.Data:=Chr(65+Random(26))+Chr(65+Random(26));
Item^.Prev:=Temp;
Temp^.Next:=Item;
Temp:=Item;
end;
end;
//контроль
procedure TForm1.Button2Click(Sender: TObject);
var Item:PItem;
begin
if Head=nil then Exit;
Memo1.Clear;
Item:=Head;
while Item^.Next<> nil do begin
Item:=Item^.Next;
Memo1.Lines.Add(Item^.Data);
end;
end;


//bubble sort
procedure TForm1.Button3Click(Sender: TObject);
var Item,First:PItem;
s:string;
begin
if (Head=nil) or (Head^.Next=nil) then Exit;
First:=Head^.Next;
while First^.Next<>Nil do begin
Item:=First^.Next;
repeat
if Item^.Data<First^.Data then begin
s:=First^.Data;
First^.Data:=Item^.Data;
Item^.Data:=s;
end;
Item:=Item^.Next;
until Item=nil;
First:=First^.Next;
end;
end;


procedure TForm1.FormDestroy(Sender: TObject);
begin
DispList;
end;


 
nejest ©   (2002-05-31 08:47) [8]

Я сам пробовал делать сортировку в ручную, оно работает только с латинскими символами, так что используй лутше метод Sort из StringList и не изобретай велосипед.


 
esVer   (2002-05-31 09:07) [9]

To:nejes
метод Sort из StringList зависит от локали, попробуйте отсортировать русский текст в английской Windows :)

Логичнее всего использовать TList + свой метод Compare.
Проблема не стоит того шума, что здесь наблюдается :)



Страницы: 1 вся ветка

Текущий архив: 2002.06.10;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.014 c
1-30865
Erlan
2002-05-29 16:42
2002.06.10
Насчет BitMap


1-30883
Nickolay
2002-05-28 15:13
2002.06.10
Как указать PAGECONTROL что бы закладки были с права?


3-30718
maxim2
2002-05-18 12:06
2002.06.10
При попытке добавит запись выдает Index is resd only


1-30753
Great DAN
2002-05-30 13:48
2002.06.10
Как переслать данные или содержимое переменной


1-30890
Leo^Sun
2002-05-30 06:58
2002.06.10
Список чисел