[kami] Skrevet 5. august 2010 Del Skrevet 5. august 2010 Det ble en funksjon som dette: void storenode(Individ Ind){ Individ Temp[size] = {0}; //Lager en array av Node-objekter initialisert til 0. int k,l, i=0, j=0; while (I[i].a > Ind.a) i++; if (I[i].a == Ind.a) i++; l=i; for (k=i; k<size-l; k++){ //copy remaining elements to Temp[] Temp[j]=I[k]; j++; } I[i] = Ind; i++; j=0; for (i; i<size; i++){ //copy back to I[] I[i]=Temp[j]; j++; } } Noen ting som fort kan bli bugs i koden din: while (I[i].a > Ind.a) i++; Legg til en sjekk på at i < size, dermed slipper du å gå out of bounds. for (k=i; k<size-l; k++){ //copy remaining elements to Temp[] hvorfor size-1? om arrayet er deklarert som a trenger du ikke -1 i for løkka her, for k går allerede innenfor grensene. (effektivt allokerer du da en plass som du aldri bruker). Et lite tips for å effektivisere koden din: - lista er allerede sorteret, så du trenger i grunn ikke den temp variablen din. - om du søker fra bakerst i lista og fremover, og hver gang plassen ikke passer, flytter elementet en bakover i arrayet ditt, må du bare skifte om på halve arrayet uten noe temp dilldall (bør kjøre mer effektivt) noa ala: NB! pass på her at size+1 er en allokert størrelse! #define MAXSIZE 500 Individ I[MAXSIZE]; //assert(MAXSIZE> (size+1)); void storenode(Individ Ind) { int previous = size+1; int i = size; for (; i > 0; i--) { if (I[i].a > Ind.a) { I[previous] = I[i]; } previous = i; } if (I[i].a > Ind.a) { I[previous] = I[i]; I[0] = Ind; } else { I[previous] = Ind; } } Lenke til kommentar
Sigdal Skrevet 5. august 2010 Forfatter Del Skrevet 5. august 2010 (endret) Takk. Da ble en bug avslørt. Endret 5. august 2010 av Sigdal Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå