for (i = l; i<=r; i++) { farmers[i].price = farmer_temp[i].price; farmers[i].milk = farmer_temp[i].milk; cout << "Array being copied " << farmer_temp[i].price << " " << farmer_temp[i].milk << " , i: " << i << endl; }
}
Jeg har lavet en lille mergesort funktion som sorter et array af structs efter structmedlemmet pris, men når jeg printer det sorterede array får jeg en del dubletter:
Forskellen er at min mergesort() (omdannet til C++) ser sådan ud: void mergesort (int l, int r) { if (r-1 > l) { int mid = (l+r)/2; mergesort(l, mid); mergesort(mid, r); merge (l,mid,r); } return; }
Hm... Jeg er ikke sikker, men du kunne jo prøve at udskifte
if (i>mid) { //.... }
med en oversættelse af det jeg bruger. Jeg bruger selv while her, men umiddelbart virker det nu som om din kode gør det samme som min. (Men okay, jeg er ikke nogen ørn til C/C++, så jeg kan jo tage fejl.)
Dette burde være korrekt: while (i != mid) { farmer_temp[k].price = farmers[i].price; farmer_temp[k].milk = farmers[i].milk; i++; k++; } while (j != end) { farmer_temp[k].price = farmers[j].price; farmer_temp[k].milk = farmers[j].milk; j++; k++; }
Som sagt er jeg ikke den store haj til C/C++, så jeg overser måske noget. Du er velkommen til at kigge på min C# kildekode og se om du kan få noget ud af det: http://pastebin.com/430898
Metoderne du skal kigge på er MergeSort og DoSort. DoSort er det der svarer til Merge - jeg valgte at kalde den DoSort fordi Merge virkede som et forkert navn. :P
Jeg ændrede min første whileløkke i merge funktionen så den var
while (i<mid && j<r) {
i stedet for
while (i<=mid && j<= r)
så virkede det :)
Synes godt om
Ny brugerNybegynder
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.