[delphi] sortowanie quicksortem

0

czesc, mam dynamiczna tablice Users typu

type
  UserRec = record

    Name: String;
    Status: TGGUserStatusExt;
    ....
  end;

i chce posortowac ja najpeir wg statusu, a potem wg nazwy (name). Moja funkcja sortujaca, to

procedure Quicksort(var arr: array of UserRec; Lewy,Prawy:integer);    //Lewy - dolny zakres tablicy prawy gorny
var
  i,j, Pomocnicza:integer;
  WzgledemKtorej: String;
begin
i:=Lewy;
j:=Prawy;
WzgledemKtorej:=arr[(Lewy+Prawy) div 2].Name;
while i<=j do
  begin
    while arr[i].Name < WzgledemKtorej do i:=i+1;
    while arr[j].Name > WzgledemKtorej do j:=j-1;
    if i<=j then
    begin
      Pomocnicza:=listorder[i]; //listorder to tablica ktora okresla kolejnosc wyswietlania tablicy users.
      listorder[i]:=listorder[j];
      listorder[j]:=Pomocnicza;
    i:=i+1;
    j:=j-1;
    end;
  end;

  if Lewy<j then
    Quicksort(arr,Lewy,j);
  if i<Prawy then
    Quicksort(arr,i,Prawy);
end;

i tu napotkalem na 2 problemy.

  1. ta funkcja sortuje tylko wg nazwy, nie wiem jak sie zabrac za podwojne sortowanie, czyli najpierw wg statusu, potem nazwy.
  2. gdy uzywam tej funkcji gdy sortuje wg nazwy, to przy 71 jej elmentach za ktorąś rekurencja wywala mi blad, i delphi zaznaca na niebiesko fragment: " if i<Prawy then". Gdy sortuje 4 elementowa tablice to wsyzstko jest ok

to wazne koledzy :)
</delphi>

0
const
  Max = 1000;

type
  List = array[1..Max] of Integer;

var
  Data: List;

procedure QuickSort(var A: List; Lo, Hi: Integer);

procedure Sort(l, r: Integer);
var
  i, j, x, y: integer;
begin
  i := l; j := r; x := a[(l+r) DIV 2];
  repeat
    while a[i] < x do i := i + 1;
    while x < a[j] do j := j - 1;
    if i <= j then
    begin
      y := a[i]; a[i] := a[j]; a[j] := y;
      i := i + 1; j := j - 1;
    end;
  until i > j;
  if l < j then Sort(l, j);
  if i < r then Sort(i, r);
end;

begin {QuickSort};
  Sort(Lo,Hi);
end;

QuickSort(Data, 1, Max);
0
  1. Jeśli to lista statusów do gg, to liczba elementów tablicy pewno nie przekracza 100, wiec chyba stosowanie AŻ quicksorta jest nieopłacalne. Powinno wystarczyć bąbelkowe.

  2. Jeśli chcesz sortować według 2 wartości, to porównujesz najpierw pierwsze, a jak okażą się równe, to według drugiej.

0
  1. Jeśli to lista statusów do gg, to liczba elementów tablicy pewno nie przekracza 100, wiec chyba stosowanie AŻ quicksorta jest nieopłacalne. Powinno wystarczyć bąbelkowe.

wiesz niektórzy maja po 200 kontaktó ^^

0

no dokladnie, jakis czas temu mialem 160 ale mam o polowe mniej bo porzadki zrobilem, dzieki za info, pokminie ;]

0

no nie mam pojecia jak sie zabrac za podwojne sortowanie w quicksort... plis help :)

0

No prosto:

  1. algorytm QuickSorta znasz
  2. w QuickSorcie porównujesz elementy
  3. zamiast porównań a<b zrób funkcję: mniejsze(a,b);
  4. w funkcji porównującej zrób np tak:
// porównujesz I pole
if a.nazwa > b.nazwa then mniejsze:=false
else
if a.nazwa < b.nazwa then mniejsze:=true
else
// I pola są równe, sprawdzasz II pole
if a.numer > b.numer then mniesze:=false
else
if a.numer < b.numer then mniejsze:=true
// II pola są też równe, sprawdzasz trzecie pole...

QuickSorta nie zmieniasz, zmieniasz jedynie treść funkcji porównującej elementy - przecież to ona porządkuje.</b>

1 użytkowników online, w tym zalogowanych: 0, gości: 1