Gibt es Bibliotheksfunktion in C-Standard-Bibliothek zu sortieren?C Bibliotheksfunktion zu sortieren
Antwort
In stdlib.h
sind mehrere C-Sortierfunktionen verfügbar. Sie können man 3 qsort
auf einem UNIX-Rechner lassen sich eine Liste von ihnen zu bekommen, aber sie sind:
- Heapsort
- quicksort
- mergesort
Heapsort und Mergesort sind nicht im Standard. – Technowise
Weder ist Quicksort. Der Standard legt nicht fest, welcher Algorithmus verwendet wird. – paxdiablo
Sie sind mindestens auf OSX. – dj2
qsort
in stdlib.h versuchen.
sicher: qsort()
ist eine Implementierung einer Art (nicht unbedingt quicksort wie der Name vermuten lassen könnte).
Try man 3 qsort oder eine Lese bei http://linux.die.net/man/3/qsort
'qsort' muss nicht mit Quicksort implementiert werden. –
qsort()
ist die Funktion, die Sie suchen. Sie rufen es mit einem Zeiger auf Ihr Array von Daten, die Anzahl der Elemente in diesem Array, die Größe jedes Elements und eine Vergleichsfunktion auf.
Es macht seine Magie und Ihr Array ist in-Ort sortiert. Es folgt ein Beispiel:
#include <stdio.h>
#include <stdlib.h>
int comp (const void * elem1, const void * elem2)
{
int f = *((int*)elem1);
int s = *((int*)elem2);
if (f > s) return 1;
if (f < s) return -1;
return 0;
}
int main(int argc, char* argv[])
{
int x[] = {4,5,2,3,1,0,9,8,6,7};
qsort (x, sizeof(x)/sizeof(*x), sizeof(*x), comp);
for (int i = 0 ; i < 10 ; i++)
printf ("%d ", x[i]);
return 0;
}
Verwendung qsort() in stdlib.
@paxdiablo Die Funktion qsort() entspricht ISO/IEC 9899: 1990 (`` ISO C90 '').
C/C++ Standardbibliothek <stdlib.h>
enthält qsort
Funktion.
Dies ist nicht die beste schnelle Art Umsetzung in der Welt, aber es schnell genug und sehr EASY verwendet werden ... die Syntax für qsort ist:
qsort(<arrayname>,<size>,sizeof(<elementsize>),compare_function);
Das einzige, was Sie brauchen, um Umsetzung ist die compare_function, die in zwei Argumente vom Typ „const nichtig“ nimmt, die geeignete Datenstruktur gegossen werden kann, und dann Rückkehr einer dieser drei Werte:
- negativ, wenn ein befo sein sollte Re b
- 0, wenn a gleich
- positiv b, wenn a nach b
1 sein sollte.Vergleicht man eine Liste von ganzen Zahlen:
werfen einfach a und b ganze Zahlen wenn x < y
, x-y
negativ ist, x == y
, x-y = 0
, x > y
ist x-y
positive x-y
eine Verknüpfung Weg ist, es zu tun :) Reverse *x - *y
zu *y - *x
für die Sortierung in absteigenden/in umgekehrter Reihenfolge
int compare_function(const void *a,const void *b) {
int *x = (int *) a;
int *y = (int *) b;
return *x - *y;
}
2. eine Liste von Strings Vergleich:
Zum Vergleich der Zeichenfolge benötigen Sie strcmp
Funktion innerhalb <string.h>
lib. strcmp
wird standardmäßig Rückkehr -ve, 0 ve entsprechend ... in umgekehrter Reihenfolge zu sortieren, umkehren nur die von strcmp zurück Zeichen
#include <string.h>
int compare_function(const void *a,const void *b) {
return (strcmp((char *)a,(char *)b));
}
3. Gleitkommazahlen Vergleich:
int compare_function(const void *a,const void *b) {
double *x = (double *) a;
double *y = (double *) b;
// return *x - *y; // this is WRONG...
if (*x < *y) return -1;
else if (*x > *y) return 1; return 0;
}
4. Vergleicht Datensätze basierend auf einem Schlüssel:
Manchmal braucht man eine komplexere Materialien zu sortieren, wie Rekord. Hier ist die einfachste Möglichkeit, es mit qsort
Bibliothek zu tun.
typedef struct {
int key;
double value;
} the_record;
int compare_function(const void *a,const void *b) {
the_record *x = (the_record *) a;
the_record *y = (the_record *) b;
return x->key - y->key;
}
Eine ziemlich gute Antwort, aber die Erklärung des Rückgabewerts der Vergleichsfunktion ist rückwärts. Außerdem machen Sie in einigen Beispielen den x-y-Trick, der zu fehlerhaften Ergebnissen führen kann (und weniger offensichtlich ist als ein einfacher Vergleich). –
Naja, soweit es mich betrifft .. das funktioniert bei jedem Contest;) –
Der x-y-Trick funktioniert nicht, wenn der Unterschied zwischen x und y größer ist als der größte darstellbare int. Es ist also in Ordnung, wenn man zwei positive Zahlen vergleicht, aber es wird nicht mithalten, zB INT_MAX und -10. Upvoted obwohl ich alle Beispiele für die Sortierung sehr unterschiedlicher Typen mag. – Douglas
Während nicht genau in der Standardbibliothek, https://github.com/swenson/sort hat nur zwei Header-Dateien Sie Zugriff auf eine breite Palette von unglaublich schnell zu bekommen Sortierung Routings umfassen kann, etwa so:
#define SORT_NAME int64 #define SORT_TYPE int64_t #define SORT_CMP(x, y) ((x) - (y)) #include "sort.h" /* You now have access to int64_quick_sort, int64_tim_sort, etc., e.g., */ int64_quick_sort(arr, 128); /* Assumes you have some int *arr or int arr[128]; */
Dies sollte mindestens doppelt so schnell wie die Standardbibliothek qsort
, da keine Funktionszeiger verwendet werden und viele andere Sortieralgorithmusoptionen zur Auswahl stehen.
Es ist in C89, sollte also in praktisch jedem C-Compiler funktionieren.
- 1. Aufruf einer externen JS-Bibliotheksfunktion mit C#
- 2. Catching Output einer Bibliotheksfunktion
- 3. Bessel Bibliotheksfunktion in Java
- 4. Wie verwende ich eine Haskell-Bibliotheksfunktion?
- 5. verdrehter Client-Aufruf von einer Bibliotheksfunktion
- 6. Sortieren nach Proxy (oder: Sortieren eines Containers durch den Inhalt eines anderen) in C++
- 7. C++: Sortieren/Alphabetisierungsmethoden
- 8. C# datagridview Zeilen sortieren?
- 9. ListBox nach Datum sortieren C#
- 10. Sortieren einer IList in C#
- 11. Nach Suchkriterien sortieren C# LINQ
- 12. [C++] Objekte nach Klassenmember sortieren
- 13. Sortieren von Befehlszeilenargumenten in C
- 14. Sortieren von Datagridview Zeilenkopf C#
- 15. Sortieren Wortfolge mit Zeigern C++
- 16. C# Sortieren, kann nicht Lambda-Ausdruck zu System.Array
- 17. Gibt es in Python eine String-Collapse-Bibliotheksfunktion?
- 18. Gibt es eine Bibliotheksfunktion oder einen Operator, um ein Tupel zu erstellen?
- 19. Ist dies die Möglichkeit, eine synchrone Bibliotheksfunktion zu erstellen, ohne einen Hintergrund-Thread zu erstellen?
- 20. g ++ Kompilierfehler: undefinierter Verweis auf eine freigegebene Bibliotheksfunktion, die existiert
- 21. Wie IEnumerable Liste zu sortieren?
- 22. Wie float Werte zu sortieren?
- 23. Wie Kategorien Arraylist zu sortieren?
- 24. C# Windows Form TreeView Sortieren nach LabelEdit
- 25. Automatisches Sortieren von #Include-Abhängigkeiten in C++
- 26. C# Mit IComparer alphanumerische Liste sortieren
- 27. DataGridView-Spalten in C# sortieren? (Windows Form)
- 28. C# dynamisch Attribut zum Sortieren auswählen
- 29. C# - Html-Tabellen analysieren und Zeilen sortieren
- 30. Liste in C# mit LINQ sortieren
@Alexandru, der ganze Sinn von SO ist ein Platz für * alle * Programmierfragen, von * jedem * Fähigkeitslevel. Wo denkst du, sollte Google Leute anweisen, wenn sie deine Frage verwenden? Die Mächte, die wollen, dass es * hier * kommt - wenn SO der beste Google-Link für diese Suchanfrage ist, ist unser Job erledigt. – paxdiablo
Mein ursprünglicher Code war faul und wahrscheinlich sehr verschieden von dem, was Sie bei einer Google-Suche gefunden hätten. Nach all der Community-Eingabe haben Sie jedoch ein Beispiel für eine gute Implementierung von qsort. – rerun
@paxdiablo: Wenn das der Fall ist, könnten sie auch einfach die Standard-lib-Dokumentation hosten - ich bezweifle, dass diese Frage irgendetwas über diesen kanonischen Verweis hinaus hier hinzufügen wird. Für einige komplexe Fälle vielleicht - aber nur um eine Grundfunktion zu finden? –