23. september 2003 - 10:28Der er
5 kommentarer og 2 løsninger
Sortere et array med talværdier
Hej, Jeg har et array, hvor der er sat 30 tilfældige talværdier ind vha. af en random funktion. Jeg har fået sorteret dem så de står i rækkefølge med de laveste tal først...Problemet er bare, at der er nogle talværdier, som er ens og det er ikke noget jeg ønsker... Er der nogen, som har et forslag til hvad man kan gøre for at undgå problemet med ens værdier?
erikjacobsen: Jeg har en random funktion, som f.eks 12 gange vælger et tal mellem 1 og 30... Det tilfældige tal må ikke have en værdi > end de 30, og det vil det med den løsning du foreslår...Men har selv tænkt tanken...
Function ArrayToString(const a : Array of Integer) : String; var i : Integer; begin Result := '['; for i := Low(a) to High(a) do begin if a[i] < 10 then Result := Result + '0' + IntToStr(a[i]) + ',' else Result := Result + IntToStr(a[i]) + ','; end;
Result [Length(Result)] := ']'; end;
procedure QuickSort(var A: array of Integer); procedure Sort(iLo, iHi: Integer); var Lo, Hi, Mid : Integer; T: integer; begin Lo := iLo; Hi := iHi; Mid := A[(Lo + Hi) div 2]; repeat while A[Lo] < Mid do Inc(Lo); while A[Hi] > Mid do Dec(Hi); if Lo <= Hi then begin T := A[Lo]; A[Lo] := A[Hi]; A[Hi] := T; Inc(Lo); Dec(Hi); end; until Lo > Hi; if Hi > iLo then Sort(iLo, Hi); if Lo < iHi then Sort(Lo, iHi); end; begin Sort(Low(A), High(A)); end;
procedure TForm1.Button1Click(Sender: TObject); var i, Len : Integer; a : Array of integer; begin len := Random(30); SetLength(a, Len); for i := 0 to Len do a[i] := Random(500);
type AInteger = Array of Integer; // denne type skal bruges i både FjerneGenGangere-proceduren og Button1Click-proceduren, hvorfor den skal være længere oppe i din kode end begge procedurere.
procedure FjernGenGangere(var A: AInteger); var I: Integer; AInt: AInteger; begin SetLength(AInt, 0); for I := Low(A) to High(A) do begin if I = Low(A) then else if A[I] <> A[I - 1] then begin SetLength(AInt, Length(AInt) + 1); AInt[High(AInt)] := A[I]; end else if A[I] <> A[I - 1] then begin SetLength(AInt, Length(AInt) + 1); AInt[High(AInt)] := A[I]; end; end; A := AInt; end;
Desuden skal Button1Click-proceduren erstattes med denne lidt ændrede version:
procedure TForm1.Button1Click(Sender: TObject); var i, Len : Integer; a : AInteger; begin len := Random(30); SetLength(a, Len); for i := Low(a) to High(a) do // Jens: Her var der en lille fejl, da din version svarede til at man skrev for i := Low(a) to Length(a) do, og Length(a) vil altid i et dynamisk array være en større end High(a). Faktisk kunne jeg ikke trykke på knappen uden at få fejl, inden jeg rettede denne fejl. begin if (i mod 6 = 0) and (i > 0) then a[i] := a[0] else a[i] := Random(500); end;
Memo1.Lines.Add(ArrayToString(A)); QuickSort(a); FjernGenGangere(a); // FjernGenGangere-proceduren virker kun i sorterede arrays, derfor skal den kaldes efter sorteringen. Memo1.Lines.Add(ArrayToString(A)); end;
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.