C로 큰 숫자를 정렬하기에 좋은 라이브러리가 있습니까?
-
19-09-2019 - |
문제
정수 또는 부유물의 큰 배열이있는 경우 정렬 (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을 스캔하여 다시 읽습니다. 마크 및 스캔 단계에는 많은 하드웨어 별 최적화가 적용될 수 있습니다.