2017-05-04 4 views
-1

Was ich versuche, ist die Implementierung eines einfachen Sortieralgorithmus, der die Funktion minButGreaterThan verwendet, um die nächstkleinere Zahl im Array zu finden. Mein Problem ist, wenn das Array eine doppelte Nummer hat, wird es am Ende übergeben und verlassen. Ich habe versucht, die Controlling-if-Anweisungen zu ändern, aber nichts scheint zu funktionieren. Irgendein Rat?Auswahl Sortierung fängt keine doppelten Zahlen ein

double GradeBook::minButGreaterThan(double x) // - NEEDS TESTING 
    { 
     double minButGreaterThan = -1; 
     for (int i = 0; i < classSize; i++) 
     { 
      if (grades[i] > x) 
      { 
       minButGreaterThan = grades[i]; 
       break; 
      } 
     } 
     for (int i = 0; i < classSize; i++) 
     { 
      if (grades[i] > x && grades[i] <= minButGreaterThan) 
       minButGreaterThan = grades[i]; 
     } 

     return minButGreaterThan; 
    } 

void GradeBook::selectionSort() //ascending order -- *DOES NOT WORK WITH DUPLICATE SCORES* - RETEST 
{ 
    double min = absoluteMin(); 
    for (int i = 0; i < classSize; i++) 
    { 
     if (grades[i] == min) 
     { 
      double temp = grades[0]; 
      grades[0] = grades[i]; 
      grades[i] = temp; 
      break; 
     } 
    } 

    for (int i = 0; i < classSize-1; i++) 
    { 
     double next = minButGreaterThan(grades[i]); 
     for (int n = 1; n <= classSize; n++) 
      if (grades[n] == next) 
      { 
       double temp = grades[n]; 
       grades[n] = grades[i+1]; 
       grades[i+1] = temp; 
      } 
    } 

} 
+0

Dies könnte für codereview.stackexchange.com geeignet sein –

Antwort

0

Sollte mit Duplikaten arbeiten, nimmt eine Auswahlsortierung nur das Minimum und verschiebt es nach links, zum "sortierten" Teil des Arrays.

Dies ist meine Implementierung:

#include <algorithm> 
#include <vector> 

using std::swap; 
using std::vector; 
using std::min_element; 

void selectionSort(vector<int> &v) { 
    for (unsigned int i = 0; i < v.size() - 1; i++) { 
     auto minElement = min_element(v.begin() + i, v.end()); 
     auto minIndex = minElement - v.begin(); 
     swap(v[i], v[minIndex]); 
    } 
} 

Unter Umständen müssen Sie ihn ändern, mit Schwimmern zu arbeiten. Jetzt scheint eine doppelte schwimmende Präzisionsstufe (double) zu viel. Ich denke, eine regelmäßige float ist in Ordnung.

+0

Benötigte es, um die angegebene Funktion minButGreaterThan zu verwenden, aber danke für Ihre nicht hilfreiche Eingabe, ich denke ...? –