developer tip

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

copycodes 2020. 9. 9. 08:09
반응형

정렬을 수행하는 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

반응형