2009-11-24 5 views
70

Gibt es Bibliotheksfunktion in C-Standard-Bibliothek zu sortieren?C Bibliotheksfunktion zu sortieren

+17

@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

+1

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

+0

@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? –

Antwort

2

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
+6

Heapsort und Mergesort sind nicht im Standard. – Technowise

+2

Weder ist Quicksort. Der Standard legt nicht fest, welcher Algorithmus verwendet wird. – paxdiablo

+0

Sie sind mindestens auf OSX. – dj2

4

qsort in stdlib.h versuchen.

5

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

+6

'qsort' muss nicht mit Quicksort implementiert werden. –

90

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; 
} 
+3

Sie sollten sizeof (* x) wirklich verwenden, wenn Sie den Typ in Zukunft ändern, aber +1 für die Bereitstellung eines Beispiels. – paxdiablo

+0

Was ist _tmain? –

+0

Guter Punkt, @Thomas, ich habe diese Nicht-Standard-Monstrosität los :-) – paxdiablo

2

Verwendung qsort() in stdlib.

@paxdiablo Die Funktion qsort() entspricht ISO/IEC 9899: 1990 (`` ISO C90 '').

50

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; 
} 
+0

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). –

+0

Naja, soweit es mich betrifft .. das funktioniert bei jedem Contest;) –

+1

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

3

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.

Verwandte Themen