Gibt es in der C-Standardbibliothek eine Bibliotheksfunktion zum Sortieren?
Gibt es in der C-Standardbibliothek eine Bibliotheksfunktion zum Sortieren?
Antworten:
qsort()
ist die Funktion, die Sie suchen. Sie rufen es mit einem Zeiger auf Ihr Datenarray, der Anzahl der Elemente in diesem Array, der Größe jedes Elements und einer Vergleichsfunktion auf.
Es macht seine Magie und Ihr Array ist an Ort und Stelle sortiert. Ein Beispiel folgt:
#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;
}
return (f > s) - (f < s);
qsort
Funktion" Punkt 4 "Wenn zwei Elemente als gleich verglichen werden, ist ihre Reihenfolge im resultierenden sortierten Array nicht angegeben."
Die C / C ++ - Standardbibliothek <stdlib.h>
enthält qsort
Funktionen.
Dies ist nicht die beste schnelle Sortierimplementierung der Welt, aber sie ist schnell genug und SEHR EINFACH zu verwenden ... die formale Syntax von qsort lautet:
qsort(<arrayname>,<size>,sizeof(<elementsize>),compare_function);
Das einzige, was Sie implementieren müssen, ist die compare_function, die zwei Argumente vom Typ "const void" akzeptiert, die in die entsprechende Datenstruktur umgewandelt werden können, und dann einen dieser drei Werte zurückgibt:
1. Vergleichen einer Liste von ganzen Zahlen :
einfach gegossen , wenn a und b auf ganze Zahlen x < y
, x-y
negativ ist , x == y
, x-y = 0
, x > y
, x-y
positiv
ist x-y
eine Abkürzung , wie es :) zu umkehren zu tun ist , *x - *y
um *y - *x
in abnehmenden / umgekehrte Reihenfolge zum Sortieren
int compare_function(const void *a,const void *b) {
int *x = (int *) a;
int *y = (int *) b;
return *x - *y;
}
2. Vergleichen einer Liste von Zeichenfolgen :
Zum Vergleichen von Zeichenfolgen benötigen Sie strcmp
Funktionen in <string.h>
lib.
strcmp
wird standardmäßig -ve, 0, ve entsprechend zurückgeben ... um in umgekehrter Reihenfolge zu sortieren, kehren Sie einfach das von strcmp zurückgegebene Vorzeichen um
#include <string.h>
int compare_function(const void *a,const void *b) {
return (strcmp((char *)a,(char *)b));
}
3. Vergleichen von Gleitkommazahlen :
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. Vergleichen von Datensätzen anhand eines Schlüssels :
Manchmal müssen Sie komplexere Dinge sortieren, z. B. Aufzeichnungen. Hier ist der einfachste Weg, dies mit der 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;
}
int
werden die an den Komparator übergebenen Werte beide int *
als getarnt void *
. Beim Sortieren eines Arrays von char *
werden daher die an den Komparator übergebenen Werte beide char **
als getarnt void *
. Daher muss der richtige Code sein : int compare_function(const void *a,const void *b) { return (strcmp(*(char **)a, *(char **)b)); }
.
if (x > y) return +1; else if (x < y) return -1; else return 0;
Sie für überlaufsichere Ganzzahlvergleiche , oder wenn Sie einen einfachen Ausdruck wünschen, dann return (x > y) - (x < y);
. Dies wertet immer zwei Vergleiche auf C-Ebene aus, aber der Optimierer kann dies möglicherweise vermeiden. Die Subtraktion funktioniert nicht bei vorzeichenlosen Werten. Die erste Version funktioniert gut, wenn Sie sich mit einer Reihe von Vergleichen befassen - indem Sie zuerst zwei ganzzahlige Elemente einer Struktur vergleichen und wenn sie gleich sind, dann zwei Doppelelemente, dann zwei Zeichenfolgen usw. Es gibt mehr als einen Weg, dies zu tun. in C sowie Perl.
Sicher: qsort()
ist eine Implementierung einer Art (nicht unbedingt Quicksort, wie der Name vermuten lässt).
Probieren Sie man 3 qsort aus oder lesen Sie es unter http://linux.die.net/man/3/qsort
qsort
muss nicht mit Quicksort implementiert werden.
Https://github.com/swenson/sort ist zwar nicht genau in der Standardbibliothek enthalten, verfügt jedoch nur über zwei Header-Dateien, die Sie einschließen können, um Zugriff auf eine Vielzahl unglaublich schneller Sortierroutings zu erhalten, z.
#define SORT_NAME int64 #define SORT_TYPE int64_t #define SORT_CMP ( x , y ) (( x ) - ( y )) #include "sort.h" / * Sie haben jetzt Zugriff auf int64_quick_sort, int64_tim_sort usw., z. B. * / int64_quick_sort ( arr , 128 ); / * Angenommen, Sie haben int * arr oder int arr [128]; * /
Dies sollte mindestens doppelt so schnell sein 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.
versuchen Sie es qsort
in stdlib.h.
Es stehen mehrere C-Sortierfunktionen zur Verfügung stdlib.h
. Sie können man 3 qsort
auf einem Unix-Computer eine Liste erstellen, die jedoch Folgendes enthält: