Frage C-Bibliotheksfunktion zum Sortieren


Gibt es in der C-Standardbibliothek eine Bibliotheksfunktion zum Sortieren?


75
2017-11-24 05:29


Ursprung


Antworten:


qsort() ist die Funktion, nach der 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 vor Ort 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;
}

94
2017-11-24 05:42



C / C ++ Standardbibliothek <stdlib.h> enthält qsort Funktion.

Dies ist nicht die beste schnelle Sortimplementierung auf der Welt, aber es ist schnell genug und SEHR EINFACH zu verwenden ... die formale Syntax von qsort ist:

qsort(<arrayname>,<size>,sizeof(<elementsize>),compare_function);

Die einzige Sache, die Sie implementieren müssen, ist die compare_function, die zwei übernimmt Argumente vom Typ "const void", die in die entsprechende Datenstruktur umgewandelt werden können, und dann gebe einen dieser drei Werte zurück:

  • negativ, wenn a vor b sein sollte
  • 0, wenn a gleich b ist
  • positiv, wenn a nach b sein sollte

1. Vergleichen einer Liste von ganzen Zahlen:

Wirf a und b einfach auf ganze Zahlen ob x < y,x-y ist negativ, x == y, x-y = 0, x > y, x-y ist positiv x-y ist eine Abkürzung, um es zu tun :) umkehren *x - *y zu *y - *x zum Sortieren in absteigender / umgekehrter Reihenfolge

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 der Zeichenfolge benötigen Sie strcmp Funktion innen <string.h> lib. strcmp wird standardmäßig -ve, 0, ve ... zurückgeben, um in umgekehrter Reihenfolge zu sortieren, einfach das von strcmp zurückgegebene Zeichen umkehren

#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 basierend auf einem Schlüssel:

Manchmal müssen Sie ein komplexeres Material sortieren, z. B. aufnehmen. Hier ist das einfachste So machen Sie es mit qsort Bibliothek.

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

52
2017-11-24 16:06



Sicher: qsort() ist eine Implementierung einer Art (nicht unbedingt Quicksort, wie der Name vermuten lässt).

Versuchen Sie, Mann 3 qsort oder lesen Sie bei http://linux.die.net/man/3/qsort


6
2017-11-24 05:32



Versuchen qsort in stdlib.h.


4
2017-11-24 05:31



Während nicht genau in der Standardbibliothek, https://github.com/swenson/sort hat nur zwei Header-Dateien, die Sie hinzufügen können, um Zugriff auf eine große Auswahl an unglaublich schnellen Sortier-Routings zu erhalten:

#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 wie die Standardbibliothek sein qsort, da es keine Funktionszeiger verwendet und viele andere Sortieralgorithmusoptionen zur Auswahl hat.

Es ist in C89, sollte also in praktisch jedem C-Compiler funktionieren.


3
2018-05-04 05:18



Es gibt mehrere C-Sortierfunktionen in stdlib.h. Du kannst tun man 3 qsort auf einer Unix-Maschine, um eine Liste von ihnen zu bekommen, aber sie beinhalten:

  • Heapsort
  • schnelle Sorte
  • Zusammenführen, sortieren

2
2017-11-24 05:31



Verwenden Sie qsort () in stdlib.

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


2
2017-11-24 06:32