2017-03-22 16 views
1

Ich muss entweder die ungeraden oder geraden Zahlen in einem Array sortieren, während der Rest unverändert bleibt. Da dies Teil eines Speichermanagementkurses ist, würde ich es vorziehen, keine Daten zu duplizieren, so dass ich nicht die offensichtliche Lösung wählte.Nur ungerade oder gerade Zahlen aus einem Array sortieren

Ich dachte über eine einfache Blasensortierfunktion nach, indem ich die "schlechten" ersten oder zweiten Parameter des Vergleichs überspringe. Ich werde die Funktion nur veröffentlichen, da der Rest irrelevant ist.

//these are passed as sort_type_remainder 
#define REMAINDER_EVEN 0 
#define REMAINDER_ODD 1 

void sort_integers(int *integer_list, int num_integers, int sort_type_remainder) 
{ 
    int i, j, aux, offset = 1; 
    for(i = 0; i < num_integers - 1; i++) 
    { 
     offset = 1; 
     for(j = 0; j + offset < num_integers - i; j++) 
     { 
      if(abs(integer_list[j] % 2) != sort_type_remainder) //first element to be compared is of wrong type, skip 
      { 
       j++; 
      } 
      else 
      { 
       //first element is of good type, but second element is not, increase offset and reloop first element 
       if(abs(integer_list[j + offset] % 2) != sort_type_remainder) 
       { 
        j--; 
        offset++; 
       } 
       else //both elements are of good type, bubble sort them 
       { 
        if(integer_list[j] > integer_list[j + offset]) 
        { 
         aux = integer_list[j + offset]; 
         integer_list[j + offset] = integer_list[j]; 
         integer_list[j] = aux; 
        } 
        offset = 1; 
       } 
      } 
     } 
    } 
} 

Diese Art von Arbeiten, aber einige Eingaben werden nicht richtig verarbeitet und ich kann nicht herausfinden, warum. Ich habe versucht, die Eingabegröße zu reduzieren, um einen einfacheren Weg zu finden, dies zu reproduzieren, aber sobald ich das tue, fängt es an, richtig zu arbeiten.

Hier ist der Eingang/Ausgang, ich habe die geraden Zahlen gelöscht, wie sie in ihrer Position bleiben und es macht den Fehler leichter zu bemerken.

odd 
20 
13 5 -3 4 2 -7 23 -33 1 6 -8 7 10 -51 9 -5 12 92 69 55 

output

vorzugsweise Jede Hilfe wäre oder Anregungen sehr geschätzt, mit einer Erklärung nicht nur eine Lösung.

Bearbeiten :: vollständige Programm ist hier, wollen nicht die Frage http://pastebin.com/vZDcmppV

+0

Bitte wählen Sie eine Sprache, C oder C++ jeden Indikator von jedem Element von Array ersetzt werden soll. Bei C++ handelt es sich um eine 3- oder 4-Zeilen-Lösung, die die Algorithmusfunktionen verwendet. – PaulMcKenzie

+0

@PaulMcKenzie Ich tat, tut mir leid, dachte nicht, dass es wichtig ist. Ich bin mehr daran interessiert, warum mein Ansatz nicht funktioniert, sondern eine bessere Lösung. – aron9forever

+1

Dies ist die perfekte Gelegenheit, um zu lernen, wie man einen Debugger benutzt, wenn Sie es vorher nicht getan haben. Mit einem Debugger können Sie den Code zeilenweise durchlaufen und dabei die Variablen und deren Werte überwachen. Auf diese Weise können Sie sehen, was wirklich mit dem Code vor sich geht. Alternativ könntest du zuerst ein [Rubber Enten-Debugging] (https://en.wikipedia.org/wiki/Rubber_duck_debugging) versuchen. –

Antwort

0

Krempel Wenn Sie entweder gerade oder ungerade Zahlen von einem Array sortieren müssen, das ist meine Methode:

würde ich Wählen Sie zuerst aus dem Start-Array alle ungeraden oder geraden Zahlen und was Sie tun möchten, ersetzen Sie alles durch einen Indikator (1 oder 2 hängt davon ab, ob Sie Odds oder Evens sortieren möchten).

Dann sortieren Sie das Array selbst (wenn Sie einen anderen Algorithmus als die Blasensortierung verwenden möchten, there's Big-o cheat sheet, sehr nützlich).

Und dann scannen Sie einfach Ihr erstes Array, indem Sie jedes Indice durch jede sortierte Zahlen je nach ihrer Position ersetzen.

Kurz:

Sie wollen von Array jede ungerade (oder gerade) Zahl setzen 1 in Reihe 2, und ersetzen Sie sie durch einen Indikator (alles, was man erkennen kann, wenn Array scaning 1 nach).

Sie wollen Array sortieren 2.

Dazu 2.

+0

Vielleicht möchten Sie einige Beispielcode, Beispieldatenstrukturen oder etwas veröffentlichen, weil ich nicht verstehe, was Sie vorschlagen. –

+0

Ich habe gerade mit einer kurzen Erklärung bearbeitet. –

+0

Danke für die Eingabe, aber Sie haben meinen zweiten Satz ignoriert, wo ich erwähnt habe, dass ich vermeiden will, die Daten zu duplizieren. – aron9forever

Verwandte Themen