qsort bsearch 함수 용법

http://www.cnblogs.com/syxchina/archive/2010/07/29/2197382.html
http://baike.baidu.com/view/982231.htm?fr=aladdi
bsearch 이분법
용법:void*bsearch(const void*key,const void*base,sizet nelem, size_t width, int(*fcmp)(const void *, const *));
문법:
#include < stdlib.h> 
void *bsearch( const void *key, const void *buf, size_t num, size_t size, int (*compare)(const void *, const void *) );
인자:첫 번 째 로 찾 은 키워드 입 니 다.두 번 째:찾 을 배열.세 번 째:배열 의 요소 의 수 를 지정 합 니 다.네 번 째:모든 요소 의 길이(문자 단위).다섯 번 째:비교 함 수 를 가리 키 는 지침 입 니 다.키 는 찾 으 려 는 요 소 를 가리 키 고 있 습 니 다.찾 으 려 면
기능:함수 가 배열 요소 buf[0]에서 buf[num-1]와 일치 하 는 매개 변수 key 를 반 으로 찾 습 니 다.함수 compare 의 첫 번 째 매개 변수 가 두 번 째 매개 변수 보다 작 으 면 마이너스 값 을 되 돌려 줍 니 다.0 값 을 되 돌려 주 는 것 과 같다 면;돌아 오 는 것 보다 크 면배열 buf 의 요 소 는 오름차 순 으로 배열 해 야 합 니 다.함수 bsearch()의 반환 값 은 일치 하 는 항목 을 가리 키 는 것 입 니 다.일치 하 는 항목 이 발견 되 지 않 으 면 NULL 로 돌아 갑 니 다.
qsort 기능:빠 른 정렬 루틴 을 사용 하여 정렬 합 니 다.   
*****************************************************************baidu baike*************************************************************************
용법:void qsort(void*base,int nelem,int width,int(*fcmp)(const void*,const void*);  
qsort()를 사용 하여 정렬 하고 bsearch()로 검색 하 는 것 은 비교적 자주 사용 하 는 조합 으로 사용 하기에 편리 하고 빠르다.
그 중에서 base 는 정렬 된 집합 배열 입 니 다.num 은 이 배열 요소 의 개수 입 니 다.width 는 요소 의 크기 이 고 cop 는 비교 함수 입 니 다.
예 를 들 어 길이 가 1000 인 배열 을 정렬 할 때 int a[1000];그러면 base 는 a,num 은 1000,width 는 sizeof(int),cop 함 수 는 자신의 이름 에 따라 야 합 니 다.
qsort(a,1000,sizeof(int),comp);
그 중 comp 함 수 는 다음 과 같이 써 야 합 니 다.
1
2
3
4 intcomp(constvoid*a,constvoid*b) { return *( int *)a-*( int *)b; }
위 는 작은 것 부터 큰 것 까지 정렬 하고 return*(int*)b-*(int*)a;이유
2 차원 배열 정렬 하기:
int a[1000][2]; 그 중에서 a[0]의 크기 에 따라 전체적인 순 서 를 매기 는데 그 중에서 a[1]는 a[0]와 함께 이동 하여 교환 해 야 한다.
//즉 첫 번 째 줄 과 두 번 째 줄(a[0]과 a[1]은 각각 첫 번 째 줄 과 두 번 째 줄 의 첫 번 째 주 소 를 대표 합 니 다)
1
2
3
4
5
6
7
8
9
10
11
12 qsort (a,1000, sizeof ( int )*2,comp);
  intcomp(constvoid*a,constvoid*b)
  { return (( int *)a)[0]-(( int *)b)[0]; }
**************************************************************************************************************************************************************
각 매개 변수:1 정렬 대기 배열 의 첫 번 째 주소 2 배열 에서 정렬 대기 요소 의 수량 3 각 요소 의 점용 공간 크기 4 지향 함수 의 지침
정렬 순 서 를 정 하 는 방법 은 여러 가지 가 있 습 니 다.정렬,거품 정렬,병합 정렬,빠 른 정렬 등 을 선택 하 십시오.이름 을 보면 빠 른 정렬 은 현재 공 인 된 비교적 좋 은 정렬 알고리즘 이라는 것 을 알 수 있다.이것 은 그 가 속도 가 매우 빠 르 기 때문에 시스템 도 창고 에서 이 알고리즘 을 실현 하여 우리 가 사용 하기에 편리 하 다.이것 이 바로 qsort 입 니 다.
qsort 는 유 니 버 설 을 위해 비교 함 수 를 제공 해 야 합 니 다.예 를 들 어 하나의 숫자 만 정렬 하 는 것 이 아니 라 몇 개의 숫자 를 정렬 하 는 데 사용 해 야 할 수도 있 습 니 다.예 를 들 어 하나의 구조 struct num{int a;int b; }; 그리고 저 는 num 형식의 배열 이 있 습 니 다.num ddd[100];ddd 라 는 배열 에 정렬 을 해 주 고 싶 은 데 어떻게 합 니까?a+b 의 가장 큰 num 요 소 를 배열 의 맨 앞 에 놓 고 싶 습 니 다.그러면 어떻게 합 니까?이것 은 모두 비교 함 수 를 정의 함으로써 할 수 있다.비교 함수 의 작용 은 바로 qsort 에 원소 의 크기 를 어떻게 비교 하 는 지 가리 키 는 것 이다.이러한 비교 함수 inline int MyCmp(const void*a,const void*b)는 모두 두 개의 요 소 를 매개 변수 로 하여 int 값 을 되 돌려 줍 니 다.비교 함수 가 0 보다 크 면 qsort 는 a>b 라 고 생각 합 니 다.비교 함수 가 0 qsort 와 같 으 면 a 와 b 라 는 두 요소 가 같다 고 생각 하고 0 qsort 보다 작 으 면 ab 라 고 생각 합 니 다.비교 함 수 는-1(0 이하)을 되 돌려 줍 니 다.그러면 qsort 는 a<본문 에서 정렬 하 는 것 은 모두 어 릴 때 부터 큰 정렬>이 라 고 생각 합 니 다.
1.int 형식 배열 정렬
int num[100];
Sample: int cmp ( const void *a , const void *b )
{ return *(int *)a - *(int *)b; }
qsort(num,100,sizeof(num[0]),cmp);
위 는 작은 것 부터 큰 것 까지 정렬 하고 return*(int*)b-*(int*)a;큰 것 부터 작은 것 까지 순 서 를 매 긴 다 는 이유 로
2.char 형식 배열 정렬(int 형식 과 같 음)
char word[100];
Sample: int cmp( const void *a , const void *b )
{ return *(char *)a - *(int *)b; }
qsort(word,100,sizeof(word[0]),cmp);
3.double 형식 배열 정렬(특히 주의해 야 합 니 다)
double in[100];
int cmp( const void *a , const void *b )
{ return *(double *)a > *(double *)b ? 1 : -1; }
qsort(in,100,sizeof(in[0]),cmp);
4.구조 체 1 급 정렬
struct In { double data; int other; }s[100]
//data 의 값 에 따라 어 릴 때 부터 대장 구조 체 로 정렬 되 고 구조 체 내의 정렬 에 관 한 관건 적 인 데이터 data 의 유형 은 다양 할 수 있 습 니 다.
//위의 예 를 참고 하여 쓰 시 오
int cmp( const void *a ,const void *b)
{ return (*(In *)a).data > (*(In *)b).data ? 1 : -1; }
qsort(s,100,sizeof(s[0]),cmp);
5.구조 체 2 급 정렬
struct In { int x; int y; }s[100];
//x 에 따라 작은 것 부터 큰 것 까지 정렬 하고 x 가 같 을 때 y 에 따라 큰 것 부터 작은 것 까지 정렬 합 니 다.
int cmp( const void *a , const void *b )
{
struct In *c = (In *)a; struct In *d = (In *)b;
if(c->x != d->x)
          return c->x - d->x;
else
          return d->y - c->y;
}
qsort(s,100,sizeof(s[0]),cmp);
6.문자열 정렬
struct In { int data; char str[100]; }s[100];
//구조 체 에서 문자열 str 의 사전 순서 로 정렬
int cmp ( const void *a , const void *b )
{
return strcmp( (*(In *)a)->str , (*(In *)b)->str );
}
qsort(s,100,sizeof(s[0]),cmp);
7.기하학 적 으로 돌출 된 cmp 를 계산 합 니 다.
int cmp(const void *a,const void *b)
//중점 cmp 함수,1 점 을 제외 한 모든 점,회전 각도 정렬
{
struct point *c=(point *)a;
struct point *d=(point *)b;
if( calc(*c,*d,p[1]) < 0)
         return 1;
else if( !calc(*c,*d,p[1]) && dis(c->x,c->y,p[1].x,p[1].y) < dis(d->x,d->y,p[1].x,p[1].y))
//한 직선 위 에 있 으 면 먼 것 을 앞 에 놓는다.
        return 1;
else return -1;
}
PS:qsort 함수 가 포 함 된 헤더 파일,strcmp 가 포 함 된 헤더 파일

좋은 웹페이지 즐겨찾기