Avatar billede qilanto Nybegynder
16. februar 2003 - 01:08 Der er 6 kommentarer og
1 løsning

sort array

Hejsa

Jeg skal sortere et array:

type
  TUserListe=array[1..3,1..50000] of String;
var
  Users: TUserListe;

Array er bygget op med text i [1,y]
et tal i [2,y] og tekst i [3,y]

Jeg skal sortere mit array med det største tal øverst i Users. (flere tal kan have samme værdi)

Jeg har tænkt lidt på det her... men der er 2 probler.. 1) det virker ikke 2) den duer ikke da flere tal har samme værdi:

function SortUsers (): Boolean;
var
  i: integer;
  temp1: string;
  temp2: string;
  temp3: string;
  flytcount: integer;
begin
  flytcount := UserNumber;
  repeat
    for i:=1 to UserNumber do
      begin
        if Users[2,i] <= Users[2,i+1] then
          begin
            temp1 := Users[1,i]; 
            temp2 := Users[2,i];
            temp3 := Users[3,i];
            Users[1,i] := Users[1,i+1];
            Users[2,i] := Users[2,i+1];
            Users[3,i] := Users[3,i+1];
            Users[1,i+1] := temp1;
            Users[2,i+1] := temp1;
            Users[3,i+1] := temp1;
          end
        else
          flytcount := flytcount -1;
      end;
  until flytcount = 0; //hvis den er nul, så blev der ikke flyttet nogen.. og så står alle rigtigt.
  Result := true;
end;
Avatar billede erikjacobsen Ekspert
16. februar 2003 - 01:21 #1
Hvis du vil bruge en bobble-sortering, så skriv korrekt af.
Du får problemer med at sortere talværdierne - de vil, som
du skriver det, blive sorteret alfabetisk. Du bør bruge
et array op til 50.000, hvo hvert element er en passende
record (eller evt. objekt)
Avatar billede erikjacobsen Ekspert
16. februar 2003 - 01:22 #2
...og hvor tallet er en integer (glemte jeg lige)
Avatar billede qilanto Nybegynder
16. februar 2003 - 01:38 #3
den er jeg ikke helt med på...  Det er kun talværdien de skal sorteres efter.
Avatar billede jpvj Nybegynder
16. februar 2003 - 01:51 #4
Hejsa!

Lad være med at bruge bubblesort. Algoritmen har kun teoretisk interesse, da køretiden i worst case er proportional med n!, hvor n er antallet af elementer i dit array.

Den mest kendte og meget effektive løsning hedder QuickSort, er er ikke svær at implementere. Du vil kunne finde Psqudo kode i (næsten) enhver lærebog - ellers kan du finde det på google.

Din kode vil blive mere effektiv og dynamisk (når der skal indsættes et element), hvis du implementerer dit array som en hægtet liste af objekter eller records, dvs. i stedet for at skifte alle værdier, skal du kun bytte rundt på 4 pointere. Hver record vil naturligvis fylde 8 byte mere (4 byte for hver pointer). Men vent med dette til du har fået styr på en ordentlig sorterings algoritme.

Umiddelbart kan jeg se 1 fejl i dit program: Du tester med <= hvilket betyder, at hvis der er 2 ens tal, så vil du blive ed med at bytte dem om, og din algoritme når aldrig videre (skal naturligvis teste med <).

Mvh JP
Avatar billede qilanto Nybegynder
16. februar 2003 - 03:53 #5
Jeg opgav at finde ud af det du sagde.. men jeg fik lavet en ny hjemmelavet funktion som virker:

function UserSort (): Boolean;
var
i: integer;
done: integer;
lines: integer;
nonefound: boolean;
begin
  done := 0;
  lines := FindMaxLines();
  repeat
    nonefound := true;
    for i:=1 to UserNumber do
      begin
        if (Users[2,i] <> 'done') and (Users[2,i] = IntToStr(lines)) then
          begin
            SortedUsers[1,done+1] := Users[1,i];
            SortedUsers[2,done+1] := Users[2,i];
            SortedUsers[3,done+1] := Users[3,i];
            Users[2,i] := 'done';
            nonefound := false;
            done := done+1;
          end;
      end;
      if nonefound = true then lines := lines-1;
      nonefound := true;
  until done = UserNumber;
Result := true;
end;
Avatar billede qilanto Nybegynder
16. februar 2003 - 03:53 #6
hov
Avatar billede jpvj Nybegynder
17. februar 2003 - 14:37 #7
qilanto> Det er MEGET uvelset, at tage sin egne points når du har fået et svar tilbudt. Husk på, at der sidder mennekser som hjælper 100% frivilligt, kun for at opnå "points". Hvis du ikke forstå ret svar, må du bede om at få den del du ikke forstå uddybet. At ændre "<=" til "<" kan vel ikke være så svært at forstå??!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester