[Suchalgorithmus] niedrigsten Wert im Array finden
-
Ihr kennt das sicherlich bei Suchalgorithmen: man hat eine Variable, die den hoechsten Zwischenwert speichert.
int highestValue=0; for(int i=0; i<42; ++i) for(int j=0; j<42; ++j) if(array[i][j] > highestValue) highestValue = array[i][j]; std::cout << "Der groesste Wert im Array ist " << highestValue;Wie behandle ich den genau umgekehrten Fall, naemlich dass ich den kleinsten Wert suche?
int lowestValue=9999999; //hohe Zahl for(int i=0; i<42; ++i) for(int j=0; j<42; ++j) if(array[i][j] < lowestValue) lowestValue = array[i][j]; std::cout << "Der niedrigste Wert im Array ist " << lowestValue;Diese Loesung(einfach einen hohen Anfangswert zu nehmen) finde ich recht unelegant.
Und einfach den ersten Elementwert speichern funzt leider nicht, da meine Variablendeklaration ausserhalb des Scopes des Arrays liegt.
Hat da jemand ne schoenere Loesung parat?
-
Ich würde die Funktionen min_element max_element aus der Standard-Algorithmen-Bibliothek verwenden :).
Wenn du das (aus sehr obligatorischen Gründen) nicht willst, dann eine Funktion schreiben, die das Array als Argument verlangt.
Dann kannst du am Anfang den minimal-Wert auf dein_array[0] setzen...Caipi
-
Hallo,
einfach niedrigsterWert = ersterWert; und dann
int lowestValue = array[0][0]; if(array[i][j] < lowestValue) highestValue = array[i][j];Ups, sehe gerade dass das nicht geht.
Aber warum nimmst du nicht std::valarray? Da gibt#s min() und max() Methoden.
-
@Konrad: wieso soll das nicht gehen?
versteh das problem grad nicht ganz...
@raptor: naja wenn du es mit einem hohen anfangswert machst dann würd ich eben MAX_INT nehmen
-
Raptor schrieb:
Und einfach den ersten Elementwert speichern funzt leider nicht, da meine Variablendeklaration ausserhalb des Scopes des Arrays liegt.
std::valarray - das gibts noch?

@caipi: ich wollte eigentlich ein raw array verwenden.
-
min_element ebenso max_element funktionieren auch mit "raw arrays".
Beispiel:
#include <iostream> #include <algorithm> #include <vector> int main() { srand( clock()); int a[100]; for(int i = 0; i < 100; ++i) { a[i] = rand(); std::cout << i << " = " << a[i] << "\n"; } std::vector<int> b; int* me = std::min_element( a, a+100); std::cout << *me << std::endl; return 0; }Ansonsten std::numeric_limits<int>::max() benutzen.
-
Würde einfach ne Art von "Insertion Sort" nehmen, also das Finden des kleinsten Elements, hat auch linearen Suchaufwand,wohingegen eure 2 ineinander verschachtelten Schleifen quadratischen haben:
int list[9]; //Hier Liste befüllen, könnte man auch mit Templates/anderen Typen machen, dient //nur zur Veranschaulichung int min = list[0]; for(int i = 0; i<9;i++) { if(list[i]<min) min=list[i]; } cout<<"Das Minimum ist: "<<min<<endl;
-
du schlägst genau das vor, was im startpost bereits steht, nur halt für eindimensionale arrays

