Ciao.
Una nota a margine.
Visto che lavori con interi cambia la result con:
public procedure TFPList.Sort( Compare: TListSortCompare );
If the result of this function is negative, the first pointer is assumed to be 'less' than the second and will be moved before the second in the list.
If the function result is positive, the first pointer is assumed to be 'greater than' the second and will be moved after the second in the list.
if the function result is zero, the pointers are assumed to be 'equal' and no moving will take place.
Anche i controlli che fai tu hanno il loro impatto sui tempi :)
if va1 < va2 then
Result := 1
else if va1 > va2 then
Result := -1
else
Result := 0;
rifà i controlli che vengono fatti dentro la quick sort della classe lista.
Non avendo la funzione "vincoliattivi" sotto gli occhi non possiamo dirti dove "perdi" tempo nei controlli.
La differenza che posso dirti è :
Nella sort veloce fai un confronto tra 2 numeri.
Nella sort lenta fai 2 chiamate ad una funzione.
:)
Per l'altro quesito :)
Una cosa simile potrebbe essere d'aiuto?
function confrontoPesoENumero(item1 : TItem; item2: TItem): integer;
begin
result := item1.peso - item2.peso;
if (result = 0) then
begin
result := item1.num -item2.num;
end;
end;
In questo modo puoi mettere in cascata i criteri di ordinamento.
Prima il peso e poi il numero associato.
Stilgar
PS:
Prova a precalcolare il peso dei vincoli.
Ogni lezione il suo peso.
for d:= 0 to o.giorniasettimana-1 do
for h:=0 to o.maxorealgiorno-1 do
if objlezione^.quadrovincoli[d,h] in V then inc(result);
Qui lo calcoli ad ogni compare. Presupponendo che "o" sia un oggetto/record globale/di classe.
Non vorrei che nel confronto e nella stampa (che non vedo quindi presuppongo sia in un altro ciclo) uscissero valori diversi tra di loro.
Nella stampa, salvati il valore. Poi usi il valore calcolato per fare i confronti.
Così possiamo iniziare a isolare il problema.
Stilgar