Forum: Mikrocontroller und Digitale Elektronik qsort array funktioniert nicht


von hans (Gast)


Lesenswert?

Ich benötige den kleinsten Wert im Array und möchte ein Array sortieren, 
aber es funktioniert mit qsort irgendwie nicht so wie ich möchte:

c]


uint8_t calculateIndex()
{
  uint8_t array_[3];

  array_[0] = getNumberOfArrayElements(result1);
  array_[1] = getNumberOfArrayElements(result2);
  array_[2] = getNumberOfArrayElements(result3);


  int8_t size = sizeof(array_) / sizeof(array_[0]);
        qsort((void*)array_, size, sizeof(array_[0]), comparator);

  return array_[0];
}


[/c]

von Walter T. (nicolas)


Lesenswert?

1. qsort wird nicht die schnellste Möglichkeit sein, dass Minimum aus 
einem Array zu finden. Da ist die "naive" Implementierung einer 
for-Schleife schneller.

2. In Deinem Quelltext ist "comparator" nicht definiert.

von Cyblord -. (cyblord)


Lesenswert?

Walter T. schrieb:
> Das ist die "naive" Implementierung einer
> for-Schleife schneller.

Alle Elemente durchzugehen und immer das kleinste zu speichern ist sogar 
die nachweislich schnellste überhaupt mögliche Möglichkeit. Die untere 
Schranke für die Ermittlung des Minimalwert bei einer zufälligen Folge 
von Zahlen muss ja O(n) sein.

Darum ist quicksort mit O(n*log(n)) im Mittel und sogar O(n²) im worst 
case in jedem Fall langsamer.

Schneller kann nur noch werden falls die Folge nicht zufällig ist, 
sondern gewisse Muster aufweist.

von hans (Gast)


Lesenswert?

Cyblord -. schrieb:
> Walter T. schrieb:
>> Das ist die "naive" Implementierung einer
>> for-Schleife schneller.
>
> Alle Elemente durchzugehen und immer das kleinste zu speichern ist sogar
> die nachweislich schnellste überhaupt mögliche Möglichkeit. Die untere
> Schranke für die Ermittlung des Minimalwert bei einer zufälligen Folge
> von Zahlen muss ja O(n) sein.
>
> Darum ist quicksort mit O(n*log(n)) im Mittel und sogar O(n²) im worst
> case in jedem Fall langsamer.
>
> Schneller kann nur noch werden falls die Folge nicht zufällig ist,
> sondern gewisse Muster aufweist.

Die Idee ist mir direkt nach der Fragestellung auch eingefallen. Ich 
habe es dann mit der For-Schleife gemacht.

Jedoch konnte ich nicht sofort antworten, da es nicht angemeldeten Usern 
leider nicht erlaubt ist direkt nach Eröffnen eines Threads 2 Antworten 
innert einer Stunde zu verfassen.

Den Fehler von mir habe ich bezüglich qsort auch gefunden. Es hat nicht 
funktioniert, da ich den Prototypen vergessen habe zu definieren. Das 
hätte mir aber der Compiler doch mit einer Warnung herausgeben müssen 
oder etwa nicht?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

hans schrieb:
> Das hätte mir aber der Compiler doch mit einer Warnung herausgeben
> müssen oder etwa nicht?

Da Du Deinen Quelltext nicht gezeigt hast, sondern nur ein 
Fragmentschnipselchen, lässt sich die Frage nicht wirklich beantworten.

Wenn Du eine Funktion verwendest, ohne daß an der Stelle der Verwendung 
die Funktion selbst oder ein Prototyp bekannt ist, gibt ein 
funktionierender Compiler eine entsprechende Warnung aus, das ist 
richtig. Man kann natürlich Warnungen auch abschalten, dann sieht man 
sie nicht.

von Stefan F. (Gast)


Lesenswert?

Was ist denn eigentlich die Aufgabe? Das Array zu sortieren, oder den 
kleinsten/größten Wert zu finden?

von Einer K. (Gast)


Lesenswert?

Beides !?!

von Nop (Gast)


Lesenswert?

hans schrieb:

> aber es funktioniert mit qsort irgendwie nicht so wie ich möchte:

Dann mach es "irgendwie" anders.

Beitrag #5782570 wurde von einem Moderator gelöscht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.