Namensräume
Varianten
Aktionen

qsort, qsort_s

Von cppreference.com
< c‎ | algorithm
Definiert im Header <stdlib.h>
void qsort( void* ptr, size_t count, size_t size,
            int (*comp)(const void*, const void*) );
(1)
errno_t qsort_s( void* ptr, rsize_t count, rsize_t size,

                 int (*comp)(const void*, const void*, void*),

                 void* context );
(2) (seit C11)
1) Sortiert das durch ptr zeigende Array aufsteigend. Das Array enthält count Elemente der Größe size Bytes. Die Funktion, auf die comp zeigt, wird zum Vergleichen von Objekten verwendet.
2) Gleicht (1), mit der Ausnahme, dass der zusätzliche Kontextparameter context an comp übergeben wird und dass die folgenden Fehler zur Laufzeit erkannt werden und die aktuell installierte Constraint-Handler-Funktion aufrufen
  • count oder size ist größer als RSIZE_MAX
  • ptr oder comp ist ein Nullzeiger (es sei denn, count ist null)
Wie bei allen grenzgeprüften Funktionen ist qsort_s nur garantiert verfügbar, wenn __STDC_LIB_EXT1__ von der Implementierung definiert wird und wenn der Benutzer __STDC_WANT_LIB_EXT1__ vor dem Einbinden von <stdlib.h> auf die ganzzahlige Konstante 1 setzt.

Wenn comp angibt, dass zwei Elemente äquivalent sind, ist ihre Reihenfolge im resultierenden sortierten Array nicht spezifiziert.

Inhalt

[edit] Parameter

ptr - Zeiger auf das zu sortierende Array
zählt - Anzahl der Elemente im Array
size - Größe jedes Elements im Array in Bytes
comp - Vergleichsfunktion, die einen negativen ganzzahligen Wert zurückgibt, wenn das erste Argument *kleiner* als das zweite ist, einen positiven ganzzahligen Wert, wenn das erste Argument *größer* als das zweite ist, und null, wenn die Argumente äquivalent sind.

Die Signatur der Vergleichsfunktion sollte äquivalent zu Folgendem sein

 int cmp(const void *a, const void *b);

Die Funktion darf die ihr übergebenen Objekte nicht ändern und muss konsistente Ergebnisse zurückgeben, wenn sie für dieselben Objekte aufgerufen wird, unabhängig von ihrer Position im Array.

Kontext - zusätzliche Informationen (z. B. Kollationssequenz), die als drittes Argument an comp übergeben werden

[edit] Rückgabewert

1) (keine)
2) Null bei Erfolg, ungleich Null, wenn eine Laufzeitbeschränkungsverletzung erkannt wurde

[edit] Anmerkungen

Trotz des Namens erfordern weder C noch POSIX-Standards, dass diese Funktion mittels Quicksort implementiert wird oder dass sie Komplexitäts- oder Stabilitätsgarantien macht.

Im Gegensatz zu anderen grenzgeprüften Funktionen behandelt qsort_s Arrays der Größe Null nicht als Laufzeitbeschränkungsverletzung, sondern kehrt erfolgreich zurück, ohne das Array zu verändern (die andere Funktion, die Arrays der Größe Null akzeptiert, ist bsearch_s).

Die Implementierung von qsort_s in der Windows CRT ist inkompatibel mit dem C-Standard. Die Version von Microsoft wird deklariert als: void qsort_s(void *base, size_t num, size_t width,
             int (*compare )(void *, const void *, const void *), void * context);
. Sie gibt keinen Wert zurück, und die Vergleichsfunktion hat eine umgekehrte Parameterreihenfolge im Vergleich zum Standard: der context wird zuerst übergeben.

[edit] Beispiel

#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
 
int compare_ints(const void* a, const void* b)
{
    int arg1 = *(const int*)a;
    int arg2 = *(const int*)b;
 
    if (arg1 < arg2) return -1;
    if (arg1 > arg2) return 1;
    return 0;
 
    // return (arg1 > arg2) - (arg1 < arg2); // possible shortcut
 
    // return arg1 - arg2; // erroneous shortcut: undefined behavior in case of
                           // integer overflow, such as with INT_MIN here
}
 
int main(void)
{
    int ints[] = {-2, 99, 0, -743, 2, INT_MIN, 4};
    int size = sizeof ints / sizeof *ints;
 
    qsort(ints, size, sizeof(int), compare_ints);
 
    for (int i = 0; i < size; i++)
        printf("%d ", ints[i]);
 
    printf("\n");
}

Ausgabe

-2147483648 -743 -2 0 2 4 99

[edit] Referenzen

  • C23-Standard (ISO/IEC 9899:2024)
  • 7.22.5.2 Die Funktion qsort (S. TBD)
  • K.3.6.3.2 Die Funktion qsort_s (S. TBD)
  • C17-Standard (ISO/IEC 9899:2018)
  • 7.22.5.2 Die Funktion qsort (S. 258-259)
  • K.3.6.3.2 Die Funktion qsort_s (S. 442-443)
  • C11-Standard (ISO/IEC 9899:2011)
  • 7.22.5.2 Die Funktion qsort (S. 355-356)
  • K.3.6.3.2 Die Funktion qsort_s (S. 609)
  • C99-Standard (ISO/IEC 9899:1999)
  • 7.20.5.2 Die Funktion qsort (S. 319)
  • C89/C90-Standard (ISO/IEC 9899:1990)
  • 4.10.5.2 Die Funktion qsort

[edit] Siehe auch

sucht ein Array nach einem Element unbekannten Typs ab
(function) [edit]