Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2009.10.18;
Скачать: [xml.tar.bz2];

Вниз

TList.Sort из Delphi7   Найти похожие ветки 

 
pasha_golub ©   (2009-08-18 15:55) [0]

че-то меня как-то смутил сабж.

Допустим имеем:

function Compare(Item1, Item2: Pointer): Integer;
begin
 Result := 0;
end;

var List: TList;
List.Sort(Compare);


В итоге список (по моему разумению) должен остаться без изменений ибо результаты всех сравнений "равно между собой".

Однако объекты (или чего вы там туда засунете) окажутся в обратном порядке.

Исходя из условия сравнения результат, конечно, корректный. На как-то я надеялся на более адекватное поведение. Мне важно чтобы в пределах групп не было перестановок.


 
Медвежонок Пятачок ©   (2009-08-18 16:08) [1]

очевидно что чтобы было "как хочется" надо рулить резалтом в соответствии с хотением


 
pasha_golub ©   (2009-08-18 16:12) [2]


> Медвежонок Пятачок ©   (18.08.09 16:08) [1]

Гуд. Пример. А я и рулю. Я говорю явно, что все мои итемы одинаковы. какого их надо переставлять?


 
pasha_golub ©   (2009-08-18 16:15) [3]

Исходный код из Classes.pas

procedure QuickSort(SortList: PPointerList; L, R: Integer;
 SCompare: TListSortCompare);
var
 I, J: Integer;
 P, T: Pointer;
begin
 repeat
   I := L;
   J := R;
   P := SortList^[(L + R) shr 1];
   repeat
     while SCompare(SortList^[I], P) < 0 do
       Inc(I);
     while SCompare(SortList^[J], P) > 0 do
       Dec(J);
     if I <= J then
     begin
       T := SortList^[I];
       SortList^[I] := SortList^[J];
       SortList^[J] := T;
       Inc(I);
       Dec(J);
     end;
   until I > J;
   if L < J then
     QuickSort(SortList, L, J, SCompare);
   L := I;
 until I >= R;
end;


Как оно должно выглядеть по моему разумению:


procedure QuickSort(SortList: PPointerList; L, R: Integer;
 SCompare: TListSortCompare);
var
 I, J: Integer;
 P, T: Pointer;
begin
 repeat
   I := L;
   J := R;
   P := SortList^[(L + R) shr 1];
   repeat
     while SCompare(SortList^[I], P) < 0 do
       Inc(I);
     while SCompare(SortList^[J], P) > 0 do
       Dec(J);
     if (I <= J) and SCompare(SortList^[I], SortList^[J]) <> 0) then
     begin
       T := SortList^[I];
       SortList^[I] := SortList^[J];
       SortList^[J] := T;
       Inc(I);
       Dec(J);
     end;
   until I > J;
   if L < J then
     QuickSort(SortList, L, J, SCompare);
   L := I;
 until I >= R;
end;


Жду камней.


 
Palladin ©   (2009-08-18 16:15) [4]

да... такое дело имеет место быть и в Д6...


 
pasha_golub ©   (2009-08-18 16:17) [5]

скобка лишняя одна справа


 
pasha_golub ©   (2009-08-18 16:18) [6]

    if (I <= J) and (SCompare(SortList^[I], SortList^[J]) <> 0)  then


 
Сергей М. ©   (2009-08-18 16:18) [7]


> Однако объекты (или чего вы там туда засунете) окажутся
> в обратном порядке


А не фиолетово ли в каком они окажутся порядке, если ты сам сказал. что они "равны" ?


 
Palladin ©   (2009-08-18 16:21) [8]


> [5] pasha_golub ©   (18.08.09 16:17)

если тебе нужен четкий порядок, то нужно снабдить пункты определителем этого порядка


 
pasha_golub ©   (2009-08-18 16:22) [9]

Вообщем зря я это возникал, как оказалось. КвикСорт неустойчив по определению. Мое условие только приближает его к устойчивости. Вот, чего не пузырем сделать было... :))


 
pasha_golub ©   (2009-08-18 16:24) [10]


> Сергей М. ©   (18.08.09 16:18) [7]
>
>


> А не фиолетово ли в каком они окажутся порядке, если ты
> сам сказал. что они "равны" ?

По сути тут два условия сравнения. И как верно подметил Palladin [8], нужно надгородить еще один ключ. Поэтому проще воспользоваться устойчивым алгоритмом.

Сабж просто возник из-за незнания о неустойчивости quickSort"a, а то я бы помалкивал :))


 
Anatoly Podgoretsky ©   (2009-08-18 16:41) [11]

> pasha_golub  (18.08.2009 16:22:09)  [9]

Сортировка разрушающая, но зато быстрая.


 
Медвежонок Пятачок ©   (2009-08-18 16:44) [12]

какого их надо переставлять?

Побочный эффект алгоритма перебора, который дергает конец списка и расставляет элементы по новой.


 
TUser ©   (2009-08-18 17:09) [13]

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


 
pasha_golub ©   (2009-08-18 17:15) [14]


> TUser ©   (18.08.09 17:09) [13]
>
> так и должно быть - алгоритм быстрой сортировки относится
> к неустойчивым, то есть имеет право менять порядок одинаковых
> элементов

Спасибо. Ветку всю я тоже редко читаю ;)



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

Форум: "Прочее";
Текущий архив: 2009.10.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.005 c
2-1250164694
АЫ
2009-08-13 15:58
2009.10.18
Call Methods


2-1250083110
Спрашующий =)
2009-08-12 17:18
2009.10.18
Вопрос


15-1250138266
Сергей Давыдов
2009-08-13 08:37
2009.10.18
Оплачю разработку фунции преобразования! (50$)


15-1250358753
xayam
2009-08-15 21:52
2009.10.18
Как человек думает?


2-1250078861
Lexus_samara
2009-08-12 16:07
2009.10.18
Как программно удалить одну строку из текстового файла(txt)?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский