Форум: "Основная";
Текущий архив: 2002.06.10;
Скачать: [xml.tar.bz2];
ВнизСортировка по алфавиту Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.005 c