C bibliotheekfunctie om sortering uit te voeren

Is er een bibliotheekfunctie beschikbaar in de standaardbibliotheek van C om te sorteren?


Antwoord 1, autoriteit 100%

qsort()is de functie die je zoekt. Je roept het aan met een pointer naar je gegevensarray, het aantal elementen in die array, de grootte van elk element en een vergelijkingsfunctie.

Het doet zijn magie en je array wordt op zijn plaats gesorteerd. Een voorbeeld volgt:

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

Antwoord 2, autoriteit 49%

C/C++ standaardbibliotheek <stdlib.h>bevat de functie qsort.

Dit is niet de beste quick sort-implementatie ter wereld, maar het is snel genoeg en ZEER
EENVOUDIG te gebruiken… de formele syntaxis van qsort is:

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

Het enige dat u hoeft te implementeren, is de functie Compare_, die er twee nodig heeft
argumenten van het type “const void”, die naar de juiste gegevensstructuur kunnen worden gegoten, en dan
retourneer een van deze drie waarden:

  • negatief, als a vóór b moet staan
  • 0, als a gelijk is aan b
  • positief, als a na b zou moeten staan

1. Een lijst met gehele getallen vergelijken:

gewoon a en b casten naar gehele getallen
if x < y,x-yis negatief, x == y, x-y = 0, x > y, x-yis positief
x-yis een kortere manier om het te doen 🙂
omgekeerde *x - *ynaar *y - *xvoor sorteren in aflopende/omgekeerde volgorde

int compare_function(const void *a,const void *b) {
int *x = (int *) a;
int *y = (int *) b;
return *x - *y;
}

2. Een lijst met strings vergelijken:

Voor het vergelijken van strings heb je de functie strcmpnodig in de <string.h>lib.
strcmpretourneert standaard -ve,0,ve op de juiste manier… om in omgekeerde volgorde te sorteren, draai gewoon het teken om dat wordt geretourneerd door strcmp

#include <string.h>
int compare_function(const void *a,const void *b) {
return (strcmp((char *)a,(char *)b));
}

3. Drijvende-kommagetallen vergelijken:

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. Records vergelijken op basis van een sleutel:

Soms moet je complexere dingen sorteren, zoals een record. Hier is de eenvoudigste
manier om het te doen met behulp van de bibliotheek qsort.

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

Antwoord 3, autoriteit 8%

Zeker: qsort()is een implementatie van een sort (niet noodzakelijk quicksort zoals de naam doet vermoeden).

Probeer man 3 qsort of lees op http://linux.die.net/man /3/qsort


Antwoord 4, autoriteit 5%

Hoewel niet precies in de standaardbibliotheek, heeft https://github.com/swenson/sortslechts twee header-bestanden die u kunt toevoegen om toegang te krijgen tot een breed scala aan ongelooflijk snelle sorteerroutes, zoals:

#define SORT_NAME int64
#define SORT_TYPE int64_t
#definieer SORT_CMP(x, y) ((x) - (y))
#include "sort.h"
/* U hebt nu toegang tot int64_quick_sort, int64_tim_sort, enz., bijvoorbeeld */
int64_quick_sort(arr, 128); /* Neemt aan dat je int *arr of int arr[128] hebt; */

Dit zou minstens twee keer zo snel moeten zijn als de standaardbibliotheek qsort, aangezien het geen functieaanwijzers gebruikt en veel andere sorteeralgoritme-opties heeft om uit te kiezen.

Het zit in C89, dus zou in principe in elke C-compiler moeten werken.


Antwoord 5, autoriteit 4%

probeer qsortin stdlib.h.


Antwoord 6, autoriteit 3%

Gebruik qsort()in <stdlib.h>.

@paxdiablo
De functie qsort()voldoet aan ISO/IEC 9899:1990 (“ISO C90”).


Antwoord 7, autoriteit 2%

Er zijn verschillende C-sorteerfuncties beschikbaar in stdlib.h. Je kunt man 3 qsortop een Unix-machine doen om een lijst van ze te krijgen, maar ze bevatten:

  • hoopsortering
  • snel sorteren
  • samenvoegen

Other episodes