我只是課本的搬運工,做做筆記,當練打字也可以。這裏我把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;
}