qsort, qsort_s
| Definiert im Header <stdlib.h> |
||
| (1) | ||
| errno_t qsort_s( void* ptr, rsize_t count, rsize_t size, int (*comp)(const void*, const void*, void*), |
(2) | (seit C11) |
- 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_snur 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
[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
| (C11) |
sucht ein Array nach einem Element unbekannten Typs ab (function) |
| C++ Dokumentation für qsort
| |