정렬을 수행하는 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. 키를 기준으로 레코드 비교 :
Sometimes you need to sort a more complex stuffs, such as record. Here is the simplest way to do it using qsort
library.
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;
}
For sure: qsort()
is an implementation of a sort (not necessarily quicksort as its name might suggest).
Try man 3 qsort or have a read at http://linux.die.net/man/3/qsort
While not in the standard library exactly, https://github.com/swenson/sort has just two header files you can include to get access to a wide range of incredibly fast sorting routings, like so:
#define SORT_NAME int64 #define SORT_TYPE int64_t #define SORT_CMP(x, y) ((x) - (y)) #include "sort.h" /* You now have access to int64_quick_sort, int64_tim_sort, etc., e.g., */ int64_quick_sort(arr, 128); /* Assumes you have some int *arr or int arr[128]; */
This should be at least twice as fast as the standard library qsort
, since it doesn't use function pointers, and has many other sorting algorithm options to choose from.
It's in C89, so should work in basically every C compiler.
try qsort
in stdlib.h.
Use qsort()
in <stdlib.h>
.
@paxdiablo The qsort()
function conforms to ISO/IEC 9899:1990 (``ISO C90'').
There are several C sorting functions available in stdlib.h
. You can do man 3 qsort
on a unix machine to get a listing of them but they include:
- heapsort
- quicksort
- mergesort
참고URL : https://stackoverflow.com/questions/1787996/c-library-function-to-do-sort
'developer tip' 카테고리의 다른 글
django admin-모델의 일부가 아닌 사용자 정의 양식 필드 추가 (0) | 2020.09.09 |
---|---|
AAPT2 컴파일 실패 : Android 3.0 Canary 1에서 유효하지 않은 치수 (0) | 2020.09.09 |
ASP.NET MVC Razor 모델을 레이아웃으로 전달 (0) | 2020.09.09 |
'git push origin master'에서 'origin'의 의미는 무엇입니까? (0) | 2020.09.09 |
HTML 표 셀을 편집 가능하게 만드는 방법은 무엇입니까? (0) | 2020.09.09 |