Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сортировка по алфавиту [D5]


Random ©   (2002-05-30 20:35:00) 

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


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

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

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


nejest   (2002-05-31 08:47:00) [2]

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


MBo   (2002-05-31 07:20:00) [3]

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

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;


KilkennyCat   (2002-05-31 01:48:00) [4]

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


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

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


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

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 21:57:00) [7]

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


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

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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо