/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
Sortering i Delphi
Fra : Kasper Okkels


Dato : 05-05-01 16:59

Hej - spørgsmål fra en programmeringsnybegynder

Findes der ikke en nem måde at sortere værdierne i et array på i Delphi 5?
Jeg synes, jeg har ledt og ledt, men kan ikke finde en kommando, der virker.
Og laver jeg min egen amatøragtige sorteringsrutine, så synes jeg, det tager
en hulens til tid.

Mit problem er, at jeg har et array indeholdende en masse værdier, og heraf
skal jeg have fundet alle 5%-fraktilerne. Hvis det kan gøres smartere end at
sortere arrayet og plukke værdierne ud, ja, så hører jeg også gerne det.

Og i øvrigt. Hvad er maxgrænsen for hvor stort et array kan være? Kan det
være rigtigt, at jeg skal have en fejlmeddelelse, når jeg forsøger at fylde
1 million simulationsværdier ind i et array? Hvis det er rigtigt, hvordan
overkommer man så det problen?

På forhånd tak for hjælpen. Håber på svar, en nybegynder kan forstå.

/Kasper



 
 
Helene K. NIelsen (05-05-2001)
Kommentar
Fra : Helene K. NIelsen


Dato : 05-05-01 18:51

Hej Kasper

Jeg har heller ikke fundet nogen nem måde at sortere et array, men
algoritemn er nu nem nok.

Brug en Tlist til at hold værdierne i, det plejer at virke bedere .

HKN



Thomas P (05-05-2001)
Kommentar
Fra : Thomas P


Dato : 05-05-01 19:06

> Brug en Tlist til at hold værdierne i, det plejer at virke bedere.

....og hvis du skal have hjælp med TList, så skriv bare

--
- Thomas
~~~~~~~~
....http://www.FlowCode.f2s.com - where code flows
....mailto:blomme@post.com - where email goes



Uffe Kousgaard (06-05-2001)
Kommentar
Fra : Uffe Kousgaard


Dato : 06-05-01 08:03

hej Kasper

Du er nok nødt til at sortere værdierne, hvis du skal have fat i
5%-fraktilerne.

Du skal have fat i en quicksort rutine til at udføre din sortering. Det er
også sådan en Tlist bruger internt. Den kan ses herunder. "A" er en
array-struktur som indeholder alle dine værdier (her antaget, at de er af
typen double).

Du kalder den med quicksort(1,500), hvis dit array har tal fra 1 til 500.

procedure QuickSort(iLo, iHi: longInt);
var
Lo,Hi: longInt;
mid,tt: double;
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
tt:= list[Lo]; list[Lo]:= list[Hi]; list[Hi]:= tt;
Inc(Lo);
Dec(Hi);
end;
until Lo>Hi;
if Hi>iLo then QuickSort(iLo,Hi);
if Lo<iHi then QuickSort(Lo,iHi);
end;

Hvis du opretter et array som dynamisk (via setlength og finalize) er der
stort set ingen begrænsninger på størrelsen. Der er heller ingen
begrænsninger, hvis det gøres via en global statisk variabel, hvorimod
lokale statiske variable er begrænset af stakkens størrelse.

Altså:

var
a: array [1..500000] of double
b: array of double

procedure myproc;
var
c: array [1..500000] of double
begin
// gør noget her
end;

Her bør kun c-array'et kunne give fejl, hvis stakken er defineret for lille
(default er 1 MB). 1 mio records af typen double fylder 8 Mb, så her har du
forklaringen på, at 1 mio records er for meget i din situation, men der er
som sagt masser af muligheder for at arbejde med større arrays. Se også $M
for mere om stakken.

Hilsen
Uffe


"Kasper Okkels" <okkels@mailme.dk> wrote in message
news:3rVI6.45$eY.6100069@news.mobilixnet.dk...
> Hej - spørgsmål fra en programmeringsnybegynder
>
> Findes der ikke en nem måde at sortere værdierne i et array på i Delphi 5?
> Jeg synes, jeg har ledt og ledt, men kan ikke finde en kommando, der
virker.
> Og laver jeg min egen amatøragtige sorteringsrutine, så synes jeg, det
tager
> en hulens til tid.
>
> Mit problem er, at jeg har et array indeholdende en masse værdier, og
heraf
> skal jeg have fundet alle 5%-fraktilerne. Hvis det kan gøres smartere end
at
> sortere arrayet og plukke værdierne ud, ja, så hører jeg også gerne det.
>
> Og i øvrigt. Hvad er maxgrænsen for hvor stort et array kan være? Kan det
> være rigtigt, at jeg skal have en fejlmeddelelse, når jeg forsøger at
fylde
> 1 million simulationsværdier ind i et array? Hvis det er rigtigt, hvordan
> overkommer man så det problen?
>
> På forhånd tak for hjælpen. Håber på svar, en nybegynder kan forstå.
>
> /Kasper
>
>



Casper A. Hansen (21-05-2001)
Kommentar
Fra : Casper A. Hansen


Dato : 21-05-01 13:25

"Kasper Okkels" <okkels@mailme.dk> wrote in message news:<3rVI6.45$eY.6100069@news.mobilixnet.dk>...
> Hej - spørgsmål fra en programmeringsnybegynder
>
> Mit problem er, at jeg har et array indeholdende en masse værdier, og heraf
> skal jeg have fundet alle 5%-fraktilerne. Hvis det kan gøres smartere end at
> sortere arrayet og plukke værdierne ud, ja, så hører jeg også gerne det.

Man skal sortere tallene for at få nøjagtige fraktiler undtagen hvis
der er et endeligt antal forskellige tal. eks.: hvis tallene kun kan
være et heltal mellem 1 og 100, laver man bare en array på 100
integers og tæller antallet af hvert tal.

var
C : Array[1..100] of Integer; // De 100 counters.
A : Array[0..999999] of Integer; // De 1mio tal.
begin
for i := 0 to 999999 do begin
Assert( (A[i]>=1) and (A[i]<=100) );
Inc(C[A[i]]);
end;
end;

/Casper

Nis Jørgensen (22-05-2001)
Kommentar
Fra : Nis Jørgensen


Dato : 22-05-01 22:39

On 21 May 2001 05:25:08 -0700, cah@skygate.dk (Casper A. Hansen) wrote:

>"Kasper Okkels" <okkels@mailme.dk> wrote in message news:<3rVI6.45$eY.6100069@news.mobilixnet.dk>...
>> Hej - spørgsmål fra en programmeringsnybegynder
>>
>> Mit problem er, at jeg har et array indeholdende en masse værdier, og heraf
>> skal jeg have fundet alle 5%-fraktilerne. Hvis det kan gøres smartere end at
>> sortere arrayet og plukke værdierne ud, ja, så hører jeg også gerne det.
>
>Man skal sortere tallene for at få nøjagtige fraktiler undtagen hvis
>der er et endeligt antal forskellige tal.

Ikke helt korrekt. Man kan nøjes med at sortere nogen af tallene! Fx kan
nedenstående kode, tyvstjålet fra Uffe Kousgaards indlæg, optimeres en anelse

procedure QuickSort(iLo, iHi: longInt);
var
Lo,Hi: longInt;
mid,tt: double;
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
tt:= list[Lo]; list[Lo]:= list[Hi]; list[Hi]:= tt;
Inc(Lo);
Dec(Hi);
end;
until Lo>Hi;
if Hi>iLo then QuickSort(iLo,Hi);
if Lo<iHi then QuickSort(Lo,iHi);
end;

De to sidste linjer kan erstattes med noget i retning af (min pascal-syntax er
ikke så veludviklet, men ideen skulle være klar nok:

if iLo div (.05 * Length(A)) < Hi div (.05 * Length(A)) then QuickSort (iLo,Hi);
if Lo div (.05 * Length(A)) < iHi div (.05 * Length(A)) then QuickSort (Lo,iHi);

Altså: der er ingen grund til at sortere et interval, hvis ikke der ligger en
fraktil i det.

Det vil muligvis være muligt at optimere yderligere, fx ved at estimere
fraktilerne vha stikprøver. Men det er relativt besværligere at programmere.

--
Med venlige hilsner

Nis Jørgensen, Albertslund

Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408527
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste