[c] 정렬을 수행하는 C 라이브러리 함수

C 표준 라이브러리에서 정렬을 수행 할 수있는 라이브러리 기능이 있습니까?



답변

qsort()당신이 찾고있는 기능입니다. 데이터 배열에 대한 포인터, 해당 배열의 요소 수, 각 요소의 크기 및 비교 함수를 사용하여 호출합니다.

그것은 마법을 수행하고 배열이 제자리에 정렬됩니다. 예는 다음과 같습니다.

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


답변

C / C ++ 표준 라이브러리 <stdlib.h>에는 qsort함수 가 포함되어 있습니다.

이것은 세계 최고의 빠른 정렬 구현은 아니지만 충분히 빠르고 사용하기 매우 쉽습니다 .qsort의 공식 구문은 다음과 같습니다.

qsort(<arrayname>,<size>,sizeof(<elementsize>),compare_function);

구현해야하는 유일한 것은 compare_function입니다. 이는 “const void”유형의 두 인수를 취하고 적절한 데이터 구조로 캐스트 될 수 있으며 다음 세 값 중 하나를 반환합니다.

  • 음수, a가 b 앞에 있어야하는 경우
  • a가 b와 같으면 0
  • 양수, a가 b 뒤에 있어야하는 경우

1. 정수 목록 비교 :

단순히 경우 정수 a와 b 캐스팅 x < y, x-y부정적이다 x == y, x-y = 0, x > y, x-y긍정적 인
x-y은 반대 🙂 할 수있는 바로 가기 방법 *x - *y*y - *x감소에 정렬 / 반대 순서는

int compare_function(const void *a,const void *b) {
int *x = (int *) a;
int *y = (int *) b;
return *x - *y;
}

2. 문자열 목록 비교 :

문자열을 비교하려면 lib strcmp내부의 함수 가 필요 합니다 <string.h>.
strcmp기본적으로 -ve, 0, ve를 적절하게 반환합니다 … 역순으로 정렬하려면 strcmp에서 반환 한 부호를 반대로합니다.

#include <string.h>
int compare_function(const void *a,const void *b) {
return (strcmp((char *)a,(char *)b));
}

3. 부동 소수점 수 비교 :

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. 키를 기준으로 레코드 비교 :

때로는 레코드와 같은 더 복잡한 항목을 정렬해야합니다. 다음은 qsort라이브러리를 사용하여 수행하는 가장 간단한 방법 입니다.

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


답변

확실하게 : qsort()정렬의 구현입니다 (이름에서 알 수 있듯이 반드시 quicksort는 아닙니다).

man 3 qsort를 시도하거나 http://linux.die.net/man/3/qsort 에서 읽어보십시오.


답변

표준 라이브러리에 정확히 포함되어 있지는 않지만 https://github.com/swenson/sort 에는 다음과 같이 광범위한 엄청나게 빠른 정렬 라우팅에 액세스하기 위해 포함 할 수있는 두 개의 헤더 파일 만 있습니다.

#define SORT_NAME int64 #define SORT_TYPE int64_t #define SORT_CMP ( x , y ) (( x ) - ( y )) #include "sort.h" / * 이제 int64_quick_sort, int64_tim_sort 등에 액세스 할 수 있습니다. 예 : * / 
int64_quick_sort ( arr , 128 ); / * int * arr 또는 int arr [128]이 있다고 가정합니다. * /

   
 
  

이것은 qsort함수 포인터를 사용하지 않고 선택할 수있는 다른 정렬 알고리즘 옵션이 많기 때문에 표준 라이브러리보다 최소 2 배 빠릅니다 .

C89에 있으므로 기본적으로 모든 C 컴파일러에서 작동해야합니다.


답변

qsortstdlib.h에서 시도하십시오 .


답변

사용 qsort()에서 <stdlib.h>.

@paxdiablo이 qsort()기능은 ISO / IEC 9899 : 1990 (“ISO C90 ”)을 준수합니다.


답변

에서 사용할 수있는 몇 가지 C 정렬 기능이 있습니다 stdlib.h. 당신은 할 수 man 3 qsort그들을 나열하지만이 포함 얻을 수있는 유닉스 시스템에서 :

  • 힙 정렬
  • 퀵 정렬
  • 병합 정렬