C 语言中自定义类型排序函数qsort以及相应的二分法查找函数bsearch

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
typedef struct {
char key[10];//数组的排序关键字
int other_data ;
}Record;




/*
比较函数:只比较关键字的值


*/
int r_compare( void const * a, void const * b)
{


return strcmp ( ( (Record*)a)->key , ((Record*)b)->key );


}


int randLetter()
{
int rand_num = rand()%26 +65;
int flag = rand()%2;
rand_num = (flag==1)?rand_num+32:rand_num;
return rand_num ;
}
int main()                                                
{
/*void qsort ( void * base , size_t n_elements ,size_t el_size ,
int (*compare) ( void const * , void const *) ); 
排序函数,可以用来排序任意类型的数据。
第一个参数:指向需要排序的数组
第二个参数:指定数组中元素的数目
第三个参数:指定每个元素的长度(以字节为单位)
第四个参数:指针函数(比较函数)


*/


Record array[50];


int i = 0 ;
char tmp[10];
int count = 0;
srand( (unsigned int )time(NULL));
char ch ;
for ( ;i<49 ;i++)
{   
    count = rand()%9+1;//1-9
for ( int j = 0 ; j<count; j++)
{
    ch = randLetter();
tmp[j]=ch;
}
tmp[j]='\0';
strncpy(array[i].key,tmp,count+1);
}


strncpy(array[49].key,"value",6);


for ( i=0 ; i<50; i++)
{
printf("%s\n",array[i].key);
}


qsort( array , 50 , sizeof(Record) , r_compare ) ;
printf("...................................\n");
for ( i=0 ; i<50; i++)
{
printf("%s\n",array[i].key);
}




/*
void *bsearch ( void const * key ,void const * base , size_t n_elements,
size_t el_size , int ( * compare)(void const*,void const*));
在一个已经排好序的数组中用二分法查找一个特定的元素。
第一个参数:指向需要查找的值
第二个参数:指向需要排序的数组
第三个参数:指定数组中元素的数目
第四个参数:指定每个元素的长度(以字节为单位)
第五个参数指针函数(比较函数)
*/






Record key ;
void * ans ;
strcpy(key.key ,"value");
ans = bsearch(&key,array ,50 ,sizeof(Record),r_compare ) ;
if(ans!=NULL)
{
Record * r = (Record*)ans;
printf("result:%s\n",r->key);
}
else
{
printf("search no the value\n");
}


return 0 ;
}

你可能感兴趣的:(C 语言中自定义类型排序函数qsort以及相应的二分法查找函数bsearch)