qsort(利用快速排序法排列数组)
库头文件stdlib.h
定义函数 void qsort(void * base,size_t nmemb,size_t size,int ( * compar)(const void , const void ));
函数说明 参数base指向欲排序的数组开头地址,参数nmemb代表数组中的元素数量,每一元素的大小则由参数size决定,最后一项参数compar为一函数指针,这个函数用来判断两个元素间的大小关系,若传给compar的第一个参数所指的元素数据大于第二个参数所指的元素数据则必须回传大于零的值,两个元素数据相等则回传0。
bsearch(二元搜索) (按升序排好的数据)
定义函数 void bsearch(const void *key,const void *base,size_t nmemb,size_tsize,int (*compar) (const void,const void*));
函数说明 bsearch()利用二元搜索从排序好的数组中查找数据。参数key指向欲查找的关键数据,参数base指向要被搜索的数组开头地址,参数nmemb 代表数组中的元素数量,每一元素的大小则由参数size决定,最后一项参数compar 为一函数指针,这个函数用来判断两个元素之间的大小关系,若传给compar 的第一个参数所指的元素数据大于第二个参数所指的元素数据则必须回传大于0 的值,两个元素数据相等则回传0。
附加说明 找到关键数据则返回找到的地址,如果在数组中找不到关键数据则返回NULL。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int cmpInt(const void *a,const void *b){
return *(const int*)a - *(const int*)b;
}
int cmpStr(const void *a,const void *b){
return strcmp(*(const char* const*)a,*(const char* const*)b);
}
int main(){
int i,j;
int num,size;
/*对数字进行排序和搜索*/
int Int[]={1,3,2,4,5,9,8,6,7,0};
num=sizeof(Int)/sizeof(Int[0]);
size=sizeof(Int[0]);
qsort(Int,num,size,cmpInt);
for(i=0;i<num;i++)
printf("[%d] ",Int[i]);
printf("\n");
int searchNum;
printf("Pls input the search num:");
scanf("%d",&searchNum);
int *ip=bsearch(&searchNum,Int,num,size,cmpInt);/*此处为重点,传入的是地址*/
(ip==NULL)?puts("Not Found"):puts("Found");
/*对字符串进行排序和搜索*/
char* Str[]={"BeiJing","ShangHai","TianJin","ChongQing","LuoYang","HangZhou"};
num=sizeof(Str)/sizeof(Str[0]);
size=sizeof(Str[0]);
qsort(Str,num,size,cmpStr);
for(j=0;j<num;j++)
printf("[%s] ",Str[j]);
printf("\n");
char *searchStr="LuoYang";
char *sp=(char *)bsearch(&searchStr,Str,num,size,cmpStr);/*此处为重点,传入的是地址*/
(sp==NULL)?puts("Not Found"):puts("Found");
/*对中文汉字进行排序和搜索*/
const char* ChineseStr[]={"北京","上海","洛阳","郑州","西安"};
num=sizeof(ChineseStr)/sizeof(ChineseStr[0]);
size=sizeof(ChineseStr[0]);
qsort(ChineseStr,num,size,cmpStr);
for(j=0;j<num;j++)
printf("[%s] ",ChineseStr[j]);
printf("\n");
const char* searchChinese="洛阳";
char *sc=(char *)bsearch(&searchChinese,ChineseStr,num,size,cmpStr);
(sc==NULL)?puts("Not Found"):puts("Found");
return 0;
}