Existe uma biblioteca boa para classificar uma grande variedade de números em C?
-
19-09-2019 - |
Pergunta
Se eu tiver uma grande variedade de números inteiros ou carros alegóricos, que é um algoritmo de bom / implementação de triagem (em C)?
É um pouco tarde no jogo para uma edição ... mas eu estou procurando correção e velocidade .
Solução 2
Para classificar matrizes de números, considere um algoritmo radix sort. Quando adequadamente projetada, esses tipos devem proporcionar um melhor desempenho do que GLIBC qsort ().
A biblioteca usort contém implementações específicas do tipo para todos os tipos numéricos de C maior.
http://bitbucket.org/ais/usort/wiki/Home
A vantagem da velocidade de radix sort sobre GLIBC qsort é de cerca de 2,5x para dupla precisão números de ponto flutuante em N = 1000000 no meu laptop Intel de 64 bits. No entanto, como N cresce a vantagem deve ser ainda maior, uma vez radix sort é um algoritmo de tempo linear exigir o número constante de passagens pelos dados.
Para muito pequeno de N, os mesmos despachos para um código introsort ou inserção tipo.
Outras dicas
qsort () da biblioteca padrão é um good'un.
As funções de comparação seria trivial para estes casos:
int cmp_int(const void *a, const void *b)
{
const int *ia = a;
const int *ib = b;
if (*ia < *ib)
return -1;
if (*ia > *ib)
return 1;
return 0;
}
int cmp_float(const void *a, const void *b)
{
const float *fa = a;
const float *fb = b;
if (*fa < *fb)
return -1;
if (*fa > *fb)
return 1;
return 0;
}
(EDIT:. A versão deles baseado em subtrair b de uma conta com o comportamento de estouro assinado, por isso não é uma boa idéia)
Nunca é uma má idéia para uso qsort ... se você não sabe algo sobre os números.
Você marcadas com radix sort. A quantidade de memória que você está preparado para investir? São os números dentro de um intervalo específico? Será que eles têm propriedades que faz Radix ordenação viável?
A menos que você quiser usar uma grande quantidade de memória, qsort é uma ótima opção.
Dada a enorme quantidade de RAM que estamos recebendo hoje em dia, o seguinte conjunto de classificação é possível: marcar o bit em uma matriz RAM pouco grande para cada número que você tem, em seguida, lê-los fora da parte traseira por digitalizar a RAM. Lotes de otimizações específicas-hardware pode ser aplicado para as fases de marca e de digitalização.