Esiste una funzione di libreria disponibile nella libreria standard C per eseguire l'ordinamento?
Esiste una funzione di libreria disponibile nella libreria standard C per eseguire l'ordinamento?
Risposte:
qsort()è la funzione che stai cercando. Lo chiami con un puntatore al tuo array di dati, il numero di elementi in quell'array, la dimensione di ogni elemento e una funzione di confronto.
Fa la sua magia e il tuo array viene ordinato sul posto. Segue un esempio:
#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);
qsortfunzione" Punto 4 "Se due elementi sono uguali, il loro ordine nell'array ordinato risultante non è specificato."
La libreria standard C / C ++ <stdlib.h>contiene la qsortfunzione.
Questa non è la migliore implementazione di ordinamento rapido al mondo, ma è abbastanza veloce e MOLTO FACILE da usare ... la sintassi formale di qsort è:
qsort(<arrayname>,<size>,sizeof(<elementsize>),compare_function);
L'unica cosa che devi implementare è la funzione compare_, che accetta due argomenti di tipo "const void", che possono essere convertiti nella struttura dati appropriata, e quindi restituisce uno di questi tre valori:
1. Confronto di un elenco di numeri interi :
semplicemente gettare e b di interi se x < y, x-yè negativo, x == y, x-y = 0, x > y, x-yè positivo
x-yè una scorciatoia per farlo :) inversa *x - *ya *y - *xper ordinare discendente / ordine inverso
int compare_function(const void *a,const void *b) {
int *x = (int *) a;
int *y = (int *) b;
return *x - *y;
}
2. Confronto di un elenco di stringhe :
Per confrontare la stringa, è necessaria la strcmpfunzione all'interno di <string.h>lib.
strcmpper impostazione predefinita restituirà -ve, 0, ve in modo appropriato ... per ordinare in ordine inverso, basta invertire il segno restituito da strcmp
#include <string.h>
int compare_function(const void *a,const void *b) {
return (strcmp((char *)a,(char *)b));
}
3. Confronto dei numeri in virgola mobile :
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. Confronto dei record in base a una chiave :
A volte è necessario ordinare elementi più complessi, come un record. Ecco il modo più semplice per farlo usando la qsortlibreria.
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, i valori passati al comparatore sono entrambi int *mascherati da void *. Quando si ordina un array di char *, quindi, i valori passati al comparatore sono entrambi char **mascherati da void *. Pertanto, il codice corretto deve essere: 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;o, se desideri un'espressione semplice, allora return (x > y) - (x < y);. Questo valuta sempre due confronti a livello C, ma l'ottimizzatore potrebbe essere in grado di evitarlo. La sottrazione non funziona sui valori senza segno. La prima versione funziona bene quando si ha a che fare con una serie di confronti - confrontando prima 2 membri interi di una struttura, e se sono uguali, poi due doppi, poi due stringhe, ecc. C'è più di un modo per farlo, in C così come Perl.
Di sicuro: qsort() è un'implementazione di un tipo (non necessariamente quicksort come potrebbe suggerire il suo nome).
Prova man 3 qsort o leggi su http://linux.die.net/man/3/qsort
qsortnon deve essere implementato utilizzando Quicksort.
Sebbene non sia esattamente nella libreria standard, https://github.com/swenson/sort ha solo due file di intestazione che puoi includere per ottenere l'accesso a una vasta gamma di instradamenti di ordinamento incredibilmente veloci, in questo modo:
#define SORT_NAME int64 #define SORT_TYPE int64_t #define SORT_CMP ( x , y ) (( x ) - ( y )) #include "sort.h" / * Ora hai accesso a int64_quick_sort, int64_tim_sort, ecc., ad esempio * / int64_quick_sort ( arr , 128 ); / * Presuppone che tu abbia int * arr o int arr [128]; * /
Dovrebbe essere almeno due volte più veloce della libreria standard qsort, poiché non usa puntatori a funzione e ha molte altre opzioni di algoritmo di ordinamento tra cui scegliere.
È in C89, quindi dovrebbe funzionare praticamente in ogni compilatore C.
prova qsortin stdlib.h.
Usa qsort()in <stdlib.h>.
@paxdiablo La qsort()funzione è conforme a ISO / IEC 9899: 1990 (`` ISO C90 '').
Sono disponibili diverse funzioni di ordinamento in C in stdlib.h. Puoi fare man 3 qsortsu una macchina unix per ottenere un elenco di loro ma includono: