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 .

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top