문제

정수 또는 부유물의 큰 배열이있는 경우 정렬 (C)에 대한 좋은 알고리즘/ 구현은 무엇입니까?

편집을 위해 게임에서 조금 늦었지만 정확성을 찾고 있습니다. 속도.

도움이 되었습니까?

해결책 2

숫자 배열 정렬의 경우 Radix 정렬 알고리즘을 고려하십시오. 올바르게 설계되면 이러한 종류는 glibc qsort ()보다 더 나은 성능을 제공해야합니다.

USORT 라이브러리에는 모든 주요 C 숫자 유형에 대한 유형 별 구현이 포함되어 있습니다.

http://bitbucket.org/ais/usort/wiki/home

glibc Qsort보다 Radix Sort의 속도 장점은 64 비트 인텔 랩톱에서 n = 100000에서 이중 정밀 부동 소수점 번호의 경우 약 2.5 배입니다. 그러나 N이 증가함에 따라 Radix 정렬은 데이터를 통과하는 일정한 수의 패스를 요구하는 선형 시간 알고리즘이므로 이점이 훨씬 커야합니다.

매우 작은 N의 경우 동일한 코드가 소개 또는 삽입 정렬로 발산됩니다.

다른 팁

표준 라이브러리의 qsort ()는 양호합니다.

비교 기능은 다음과 같은 경우에 사소합니다.

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

(편집 : A에서 B를 빼기를 기반으로 한 버전은 서명 된 오버 플로우 동작에 의존하므로 좋은 생각이 아닙니다.)

사용하는 것은 결코 나쁜 생각이 아닙니다 QSORT... 숫자에 대해 알지 못하면.

Radix 정렬로 태그가 지정되었습니다. 얼마나 많은 기억이 투자 할 준비가 되셨습니까? 숫자는 특정 범위 내에 있습니까? 그들은 radix 정렬을 가능하게하는 속성이 있습니까?

많은 메모리를 사용하지 않는 한 QSORT는 훌륭한 옵션입니다.

요즘 우리가 얻는 엄청난 양의 RAM이 주어지면 다음 세트 정렬이 가능합니다. 비트를 가지고있는 각 숫자에 대해 거대한 RAM 비트 어레이에 비트를 표시 한 다음 RAM을 스캔하여 다시 읽습니다. 마크 및 스캔 단계에는 많은 하드웨어 별 최적화가 적용될 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top