我只是课本的搬运工,做做笔记,当练打字也可以。这里我把qsort放前面讲是因为bsearch在使用之前需要对数组进行排序,排完后才能进行查找。老师说学了快排之后就不要用冒泡排序法和选择排序法了,然而我选择排序还不太会,找个时间整理整理吧。
快速排序
qsort函数:
头文件:<cstdlib> 或 <search.h>
功能:对具有num个元素,每个元素占width字节的数组base按升序进行快速排序,并用排序后的数组覆盖该数组。compare函数介绍见二分查找。
函数原型:
void qsort(void * base,size_t num , size_t width , int(cdecl*compare)(const void*elem1 , const elem2));
Qsort 使用实例:
#include<iostream>
#include<cstdlib>
#include<string>
using namespace std;
int compare(const void*a, const void*b)
{
return strcmp((char*)a, (char*)b);
}
int main()
{
char list[5][4] = { "cap", "car", "cab", "can", "cat" };
qsort((void*)list, 5, sizeof(list[0]), compare);
cout << "排序后的数组:" << endl;
for (int i = 0; i < 5; i++)
cout << list[i] << '\t';
cout << endl;
}
二分查找
bsearch函数:
头文件:<cstdlib> 或 <search.h>
功能:对具有num个元素,每个元素的宽度为width字节的已排序的数组进行二分查找。
函数原型:
Void * bsearch (const void * key , const * base , size_t num , size_t width , int (cdecl * compare)(const void * elem1 , const void * elem2));
分析:
key为查找关键字,base为指向查找对象的指针(地址),num为查找对象的元素个数,
Width为元素所占的字节数,elem1为查找的关键字的指针,elem2为与关键字比较的数组元素的指针,compare为比较两个元素elem1和elem2的函数。
在查找中调用compare函数一次或多次,每次都自动传送两个数组元素的指针。Compare函数比较这两个元素的大小(之所以能比较,是因为用了strcmp()函数),返回如下值之一:
( 补充说明:
strcmp() 比较两字符串的大小
)
<0 elem1小于elem2
=0 elem1等于elem2
>0 elem1大于elem2
函数返回查找指针。如果查找成功,查找指针指向key,如果查找失败,查找指针为NULL。如果查找对象(数组)未排序或包含相同的关键字,其执行结果不可预料。
Bsearch使用实例:
#include<iostream>
#include<cstdlib>
#include<string> //为strcmp()函数提供原型
using namespace std;
int compare(const void *a,const void *b)
{
return strcmp((char*)a, (char*)b);
}
int main()
{
char list[5][4] = { "cab", "can", "cap", "car", "cat" };
if (bsearch("cab", (void*)list, 5, sizeof(list[0]), compare) != NULL)
cout << "该关键字在数组中存在!" << endl;
}