Namespaces
Variants

qsort, qsort_s

From cppreference.net
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 gegebene Array, auf das ptr zeigt, in aufsteigender Reihenfolge. Das Array enthält count Elemente von je size Bytes. Die Funktion, auf die comp zeigt, wird für den Objektvergleich verwendet.
2) Gleich wie (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 größer als RSIZE_MAX sind
  • ptr oder comp ein Nullzeiger sind (es sei denn, count ist null)
Wie bei allen bounds-checked-Funktionen ist qsort_s nur garantiert verfügbar, wenn __STDC_LIB_EXT1__ durch die Implementierung definiert ist und wenn der Benutzer __STDC_WANT_LIB_EXT1__ auf die Integer-Konstante 1 setzt, bevor <stdlib.h> eingebunden wird.

Wenn comp zwei Elemente als äquivalent kennzeichnet, ist ihre Reihenfolge im resultierenden sortierten Array nicht spezifiziert.

Inhaltsverzeichnis

Parameter

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

Die Signatur der Vergleichsfunktion sollte der folgenden entsprechen:

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

Die Funktion darf die übergebenen Objekte nicht modifizieren und muss konsistente Ergebnisse liefern, wenn sie für dieselben Objekte aufgerufen wird, unabhängig von deren Position im Array.

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

Rückgabewert

1) (keine)
2) null bei Erfolg, ungleich null bei Erkennung einer Laufzeitbedingungsverletzung

Hinweise

Trotz des Namens verlangen weder die C- noch die POSIX-Standards, dass diese Funktion mittels Quicksort implementiert wird oder irgendwelche Komplexitäts- oder Stabilitätsgarantien bietet.

Im Gegensatz zu anderen grenzprüfenden Funktionen behandelt qsort_s Arrays mit der Größe Null nicht als Laufzeitbedingungsverletzung und gibt stattdessen 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 im Windows CRT ist nicht mit dem C-Standard kompatibel. Die Microsoft-Version 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 im Vergleich zum Standard eine umgekehrte Parameterreihenfolge: Der context wird zuerst übergeben.

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

Referenzen

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

Siehe auch

durchsucht ein Array nach einem Element eines nicht näher bezeichneten Typs
(Funktion)