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 컴파일러에서 작동해야합니다.
답변
qsort
stdlib.h에서 시도하십시오 .
답변
사용 qsort()
에서 <stdlib.h>
.
@paxdiablo이 qsort()
기능은 ISO / IEC 9899 : 1990 (“ISO C90 ”)을 준수합니다.
답변
에서 사용할 수있는 몇 가지 C 정렬 기능이 있습니다 stdlib.h
. 당신은 할 수 man 3 qsort
그들을 나열하지만이 포함 얻을 수있는 유닉스 시스템에서 :
- 힙 정렬
- 퀵 정렬
- 병합 정렬